【问题标题】:Databinding question: DataGridView <=> XDocument (using LINQ-to-XML)数据绑定问题:DataGridView <=> XDocument(使用 LINQ-to-XML)
【发布时间】:2010-04-29 15:07:51
【问题描述】:

到目前为止,学习 LINQ 很有趣,但是尽管阅读了几本书和大量有关该主题的在线资源,但我仍然觉得自己完全是 n00b。最近,我刚刚了解到,如果我的查询返回 Anonymous 类型,我填充的 ​​DataGridView 将是 ReadOnly(因为,显然 Anonymous 类型是 ReadOnly。)

现在,我正在尝试找出最简单的方法:

  1. 从 XML 文件中获取数据子集到 DataGridView 中,
  2. 允许用户编辑所述数据,
  3. 将更改的数据重新粘贴到 XML 文件中。

到目前为止,我已经弄清楚了第 1 步和第 2 步:

public class Container
{
    public string Id { get; set; }
    public string Barcode { get; set; }
    public float Quantity { get; set; }
}

// For use with the Distinct() operator
public class ContainerComparer : IEqualityComparer<Container>
{
    public bool Equals(Container x, Container y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Container obj)
    {
        return obj.Id.GetHashCode();
    }
}

var barcodes = (from src in xmldoc.Descendants("Container")
        where src.Descendants().Count() > 0
        select
        new Container
        {
           Id = (string)src.Element("Id"),
           Barcode = (string)src.Element("Barcode"),
           Quantity = float.Parse((string)src.Element("Quantity").Attribute("value"))
        }).Distinct(new ContainerComparer());

dataGridView1.DataSource = barcodes.ToList();

这非常适合从 XML 中获取我想要的数据到 DataGridView 中,以便用户可以操作这些值。

在对我的代码进行逐步跟踪后,我发现对 DataGridView 中的值所做的更改未绑定到 XDocument 对象,因此不会传播回来。

我们如何处理第 3 步? (将数据返回到 XML)是否可以将 XML 直接绑定到 DataGridView?还是我必须编写另一个 LINQ 语句才能将 DGV 中的数据返回到 XDocument?

建议?

【问题讨论】:

    标签: c# data-binding datagridview linq-to-xml


    【解决方案1】:

    所以我认为您遇到的问题是您绑定到的对象与 XML 源文档之间没有关系。

    您正在做的是创建一个对象堆,推入一些字符串和一个浮点数,然后将网格视图绑定到该对象列表。所有对象都知道在构造函数中给出了一些数据,它不知道这些数据来自哪里。当您调用“select new something()”时,您正在创建一个新对象,该新对象不知道也不关心它是使用 LINQ to XML 创建的...

    我能想到的最简单的解决方法是更改​​容器属性的设置器,以便它们加载 XML,更改它们应该表示的元素,然后再次保存 xml。也许给 Container 一个对元素或文档的引用会更容易。

    另一种方法是挂钩网格视图事件,以便在编辑行时捕获更改并将其写入 XML 文件。

    【讨论】:

    • 嗯...我想我明白你的意思了。这是我希望与某人进行的对话。由于我不清楚幕后发生了什么,我不确定我应该对所有这些“LINQ 魔术”有什么期待。我的印象是 LINQ 正在返回对 XDocument 中位置的引用,并且将其连接到 DGV 将允许更改直接传播回来。但现在这似乎有点傻。 (或者可能太容易了。)编程从来都不是一件容易的事。 (虽然它仍然很有趣。)我想我需要再考虑一下......
    • 好的,我已经考虑了更多,现在我非常清楚,只要我将每个 XML 元素 CAST 到另一个对象,我就在使用副本。 (没有对 XML/XDocument 的引用。)我将不得不更多地考虑创造一种直接引用 XML 文档的方法(如果它甚至值得编程这样的东西。)再次感谢 Glenn ! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多