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