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

Posted

技术标签:

【中文标题】使用 LINQ 从选定的 XML 元素填充 DataGridView【英文标题】:Populate DataGridView from selected XML element using LINQ 【发布时间】:2018-11-01 03:34:16 【问题描述】:

我想在 winforms 的 datagridview 中显示项目列表。这些项目来自看起来像这样的 XML 文件..

<Document name="DATA"> 需要所有<Field></Field>。我曾尝试使用 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"> 下的其他节点不能一起显示?如何修改代码?

【问题讨论】:

【参考方案1】:

您的 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,
                    ;

【讨论】:

我认为它只需要指定 until 属性然后它将选择所有子节点。非常感谢您。它对我有用。【参考方案2】:
var listQ = query.ToList();

foreach (var item in listQ)

    dataGridView1.DataSource = query.ToList();

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

【讨论】:

我已经尝试将它放在循环之外。输出仍然只显示第一个<Field></Field>

以上是关于使用 LINQ 从选定的 XML 元素填充 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 从 xml 中删除元素

从不同的 XML 元素创建相同的 LINQ 匿名类型

从选择元素中获取选定的选项

ViewModel 中的 XML 到 LINQ 以填充模型

LINQ to XML 查询不返回任何结果

LINQ to DataSet