none
Заполнение ListView данными из XML RRS feed

  • Вопрос

  • Доброго времени суток.

    Подскажите, как заполнить ListView  данными из XML файла? Приемущественно с изпользованием LINQ to XML

    Вот тестовый файл

    <?xml version="1.0"?>
    <Songs>
       <Song>
          <Name>Star Spangled Banner</Name>
          <Artist>Francis Scott Key</Artist>
          <Genre>Patriotic</Genre>      
       </Song>
       <Song>
          <Name>Blankity Blank Blank</Name>
          <Artist>Something Something</Artist>
          <Genre>Here here</Genre>
       </Song>
    </Songs>

    Есть форма, на ней есть ListView и 3 колонки, которые соответствуют элементам из XML - Name, Artist, Genre.

    Предположим, пусть загрузка происходит при наступлении события Load. Сам XML файл лежит на раб. столе.

    19 августа 2013 г. 17:31

Ответы

Все ответы

  • Ну к примеру
     private void Form1_Load(object sender, EventArgs e)
            {
                XElement xe = XElement.Load(@"C:\x.xml");
                foreach (XElement p in xe.Nodes())
                {
                    listView1.Items.Add(new ListViewItem(new string[] { p.Element("Name").Value, p.Element("Artist").Value, p.Element("Genre").Value }));
                }
            }

    19 августа 2013 г. 17:57
  • Не получается....я вот тоже пытаюсь сделать нечто подобное...

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace PopulateListView
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //XDocument document = XDocument.Load("TestXML.xml");
                //var songs = from item in document.Descendants("Song")
                //            select new
                //            {
                //                Name = item.Descendants("name").First().Value,
                //                Category = item.Descendants("artist").First().Value,
                //                Genre = item.Descendants("genre").First().Value,
                //            };
    
                SongsList.Columns.Add("Name");
                SongsList.Columns.Add("Artist");
                SongsList.Columns.Add("Genre");
    
                XDocument document = XDocument.Load("TestXML.xml");
                foreach (var item in document.Descendants("songs"))
                {
                    ListViewItem songitem = new ListViewItem (new string []
                    item.Element("Name").Value,
                    item.Element("Artist").Value,
                    item.Element("Genre").Value,
                });
                SongsList.Items.Add(Item);
    
            }
       }
    }
    

    Тут все подчеркивает красным

    new string [] item.Element("Name").Value,

    19 августа 2013 г. 18:01
  • Или тут еще нужно использовать в добавок ко всему класс Data Set, чтобы данные из XML загружать в память, а потом уже в List View ?
    19 августа 2013 г. 18:12
  • Не работают в смысле компилятор не компилирует?

    Ошибка №1:

    new ListViewItem (new string [] //где открывающая скобка?
                    item.Element("Name").Value,
                    item.Element("Artist").Value,
                    item.Element("Genre").Value, // почему стоит запятая после последнего элемента?
                });

    Ошибка №2: что такое 

    Item?

    19 августа 2013 г. 18:23
  • В общем, получил, то, что хотел.

    Не знаю, насколько хороший подход, т.к. пример написан индусами ) и взят вот от сюда  http://www.c-sharpcorner.com/UploadFile/c5c6e2/binding-xml-data-to-listview-control-dataset-approach/

    ну а мой код выглядит так

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace PopulateListView
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
                DataSet ds = new DataSet();
                ds.ReadXml(@"D:\Programs\ListWiewTest\ListWiewTest\bin\Debug\TestXML.xml");
                ListViewItem item;
                foreach(DataRow dr in ds.Tables["song"].Rows)
                {
                    item = new ListViewItem(new string[]
                    { dr["Name"].ToString(),
                      dr["Artist"].ToString(),
                      dr["Genre"].ToString()});
                    SongsList.Items.Add(item);
                }
            }
    
        }
    }
    

    19 августа 2013 г. 18:27
  • Индусы хорошие прогеры)
    19 августа 2013 г. 18:30
  • А вот тут

     foreach (var item in document.Descendants("songs"))
                {
                    ListViewItem songitem = new ListViewItem (new string []
                    item.Element("Name").Value,
                    item.Element("Artist").Value,
                    item.Element("Genre").Value,
                });
                SongsList.Items.Add(Item);

    есть замечания. почему у вас не работало так потому что 

    document.Descendants("songs")

    возвращает вам по сути исходный узел. 

    19 августа 2013 г. 18:33
  • Может есть еще варианты, как завязать данные из XML c ListView ... кроме как указанным способом?
    19 августа 2013 г. 18:56
  • Что-нибудь проще не встречал никогда)
    20 августа 2013 г. 4:07
  • Ребята, а если я хочу сделать чтобы был урл-ссылка и по нажатию двойным кликом переходила по ссылке или качала в новом окне программы
    11 октября 2014 г. 14:03