使用LINQ从选定的XML元素填充DataGridView

时间:2018-11-01 03:34:16

标签: c# xml winforms linq datagridview

我想在winforms的datagridview中显示项目列表。这些项目来自如下所示的XML文件。

GetLotDetails.xml

仅需要<Field></Field>中的所有<Document name="DATA">。我尝试使用LINQ显示它们,但它仅返回第一个<Field>节点。

我已经完成的当前代码:-

XElement doc = XElement.Load("GetLotDetails.xml");
var data = doc.Descendants("Document")
           .Where(x => (String)x.Attribute("name") == "DATA");

var query = from d in data
            select new
            {
              Name = (String)d.Element("Field").Attribute("name").Value,
              Type = "String",
              Value = (String)d.Element("Field").Value,
            };
var listQ = query.ToList();
dataGridView1.DataSource = query.ToList();

有人可以帮我解释一下为什么<Document name="DATA">下的其他节点不能一起显示吗?我该怎么做才能修改代码?

2 个答案:

答案 0 :(得分:0)

var listQ = query.ToList();

foreach (var item in listQ)
{
    dataGridView1.DataSource = query.ToList();
}

为什么要在foreach循环内分配DataSource?这可以在循环外完成。

答案 1 :(得分:0)

您的LINQ方法仅返回一个文档节点。并且您的LINQ查询正在选择第一个元素属性和值。 SelectMany将帮助您获取子节点。

        var data = doc.Descendants("Document")
                   .Where(x => (String)x.Attribute("name") == "DATA")
                   .SelectMany(x => x.Elements("Field"));

        var query = from d in data
                    select new
                    {
                        Name = d.Attribute("name").Value,
                        Type = "String",
                        Value = d.Value,
                    };