【问题标题】:Populate DataGridView from selected XML element using LINQ使用 LINQ 从选定的 XML 元素填充 DataGridView
【发布时间】: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"> 下的其他节点不能一起显示?如何修改代码?

【问题讨论】:

    标签: c# xml winforms linq datagridview


    【解决方案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>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多