2010-04-28 12 views
5

我目前正在做LINQ到XML並用我的查詢填充DataGridView就好了。我遇到的麻煩是一旦加載到DataGridView中,值看起來是不可編輯的(ReadOnly)。這裏是我的代碼:LINQ到XML到DataGridView:無法編輯字段 - 如何解決?

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

dataGridView1.DataSource = barcodes.ToList(); 

我在某處讀到「當您使用匿名類型時,DataGridView將處於ReadOnly模式」。但是我找不到解釋爲什麼或者究竟該怎麼做的解釋。

任何想法?

編輯 - 這是我想出了...

所以我增加了一個「容器」類的答案(使用get和set < - 非常重要),以避免匿名類型是隻讀問題:

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(); 
     } 
    } 

,改變了LINQ聲明:

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()); 

就是這樣!感謝您的幫助,Glenn!

回答

5

當綁定到匿名類型時,數據網格視圖處於只讀模式的原因是匿名類型爲ReadOnly。如果將視圖綁定到僅具有隻讀屬性的對象列表,您將獲得相同的行爲。

我知道的唯一解決方案是爲可編輯的數據創建容器。一個具有定義get和set的屬性的類將會給你你所追求的東西。

+0

@Glenn:謝謝。這在我的腦海中是有道理的。雖然原諒我是一名LINQ新手,但我仍然試圖圍繞引擎蓋下發生的事情頭腦。我感到困惑的是,似乎匿名類型仍會返回對每個值的引用,例如,當DataGridView的某個字段中的值發生更改時,XDocument中的XML數據也會同時發生更改。那麼你是否說如果我創建了一個可以包含這些值的類,那我就能夠得到我正在尋找的東西? – Pretzel 2010-04-29 13:06:49

0

這可能是因爲C#3的限制 - 你不能使用匿名類型作爲方法的返回類型。例如參見this