在DataGridView中显示特定的xml数据

时间:2017-10-24 15:28:21

标签: c# xml winforms data-binding datagridview

我在C#中创建了WinForm,现在我想显示我的XML文件的选定数据,以便在DataGridView中显示。我找到了一些链接,这些链接有助于在DataGridView中显示所选元素,但它没有显示应该如此。

以下是我的XML文件

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Vehicle>
    <Number_Plate>PHZ-888</Number_Plate>
    <Make>Honda</Make>
    <Model>City</Model>
    <Year>2008</Year>
  </Vehicle>
  <Vehicle>
    <Number_Plate>VGQ-141</Number_Plate>
    <Make>Suzuki</Make>
    <Model>Mehran</Model>
    <Year>2001</Year>
  </Vehicle>
  <Vehicle>
    <Number_Plate>VZH-403</Number_Plate>
    <Make>Audi</Make>
    <Model>A7</Model>
    <Year>2008</Year>
  </Vehicle>

  <Vehicle>
    <Number_Plate>BCH-184</Number_Plate>
    <Make>Honda</Make>
    <Model>Accord CL9</Model>
    <Year>2007</Year>
  </Vehicle>
</root>

以下是我试图用来获取特定元素的查询:

XDocument xdoc = XDocument.Load("vehicle20.xml");

var query = from key in xdoc.Descendants("Vehicle")
            where key != null && (key.Element("Make").Value == makelist)
            select key.Value;
dataGridView1.DataSource = query.ToList();

makelist是我如何通过汽车模型搜索,例如“本田”。

查询后显示:

enter image description here

但我希望显示指定车辆元素的所有后代,例如奥迪只显示奥迪数据,这样:

enter image description here

2 个答案:

答案 0 :(得分:1)

结果是预期的,因为您正在选择Key.value。如果要获得所需的显示,则应将结果包装在对象中:

var query = from key in xdoc.Descendants("Vehicle")
          where key != null && (key.Element("Make").Value == "Honda")
          select new
          {
             Make = key.Element("Make").Value,
             Model = key.Element("Model").Value
          };

答案 1 :(得分:1)

作为一个选项,您可以将xml数据加载到DataSet并以DataGridView方式显示:

var ds = new DataSet();
ds.ReadXml("path to the xml file");
dataGridView1.DataSource = ds.Tables[0]; //ds.Tables[Vehicle]

然后,要过滤数据并显示某些特定行,您可以通过以下方式应用过滤器:

ds.Tables[0].DefaultView.RowFilter = "Make='Honda'";