到目前为止学习LINQ已经很有趣了,但是尽管阅读了几本关于这个主题的书籍和一些在线资源,我仍然觉得总共n00b。最近,我刚刚了解到如果我的查询返回一个匿名类型,我填充的DataGridView将是ReadOnly(因为,显然匿名类型是ReadOnly。)
现在,我正试图找出最简单的方法:
到目前为止,我已经找到了第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中,以便用户可以操作值。
在执行我的代码的Step-thru跟踪时,我发现DataGridView中对值所做的更改未绑定到XDocument对象,因此不会传播回来。
我们如何处理第3步? (将数据恢复为XML)是否可以将XML直接绑定到DataGridView?或者我是否必须编写另一个LINQ语句以将数据从DGV返回到XDocument?
Suggstions?
答案 0 :(得分:1)
所以我认为你遇到的问题是你绑定的对象和XML源文档之间没有关系。
您正在做的是创建一堆对象,推入一些字符串和一个浮点数,然后将网格视图绑定到该对象列表。所有对象都知道在构造函数中给出了一些数据,它不知道数据来自何处。当您调用“select new something()”时,您正在创建一个新对象,该新对象不知道或不关心它是使用LINQ to XML创建的......
我能想到解决问题的最简单方法是更改容器属性的setter,以便加载XML,更改它们应该表示的元素,然后再次保存xml。也许给Container一个元素或文档的引用会使这更容易。
另一种方法是挂钩到网格视图事件,以便在编辑行时可以捕获更改并将它们写入XML文件。