2010-04-29 77 views
1

到目前为止学习LINQ已经非常有趣,但尽管阅读了一些书籍和一些关于该主题的在线资源,但我仍然觉得总共的n00b。最近,我刚刚了解到,如果我的查询返回Anonymous类型,则我正在填充的DataGridView将为ReadOnly(因为显然匿名类型是ReadOnly。)数据绑定问题:DataGridView <=> XDocument(使用LINQ到XML)

现在,我试图找出最简单的方法于:

  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?

Suggstions?

回答

1

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

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

我想到的最简单的方法来解决它将更改容器属性的setter,以便加载XML,更改它们应该表示的元素,然后再次保存xml。也许给容器对元素或文档的引用会使这更容易。

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

+0

嗯...我想我明白你的意思了。这就是我期待与某人交谈的那种对话。由于我不清楚幕后发生了什么事,我不确定我应该对这个“LINQ Magic”有什么期待。我的印象是,LINQ正在返回XDocument中位置的引用,并将它连接到DGV将允许更改直接传回。但现在看起来有点傻。 (或者也许太简单了)。 (尽管它仍然很有趣)。我想我需要考虑更多... – Pretzel 2010-04-30 02:59:24

+0

好吧,我已经考虑了更多,现在我已经非常清楚,只要我CAST每个XML元素到另一个对象,我正在做一个副本。 (没有引用回到XML/XDocument。)我将不得不更多地考虑如何直接引用/从XML文档中引用(如果它甚至值得像这样编程)。再次感谢Glenn! :-) – Pretzel 2010-04-30 14:50:25