使用 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的主要内容,如果未能解决你的问题,请参考以下文章