2010-04-28 9 views
5

Obecnie robię LINQ-do-XML i zapełnianie DataGridView z mojego kwerendy po prostu w porządku. Problem polega na tym, że po załadowaniu do DataGridView, wartości wydają się być Un-editable (ReadOnly). Tu jest mój kodu: „DataGridView będzie w trybie tylko do odczytu podczas korzystania typy anonimowe”LINQ-do-XML do DataGridView: Nie można edytować pól - Jak naprawić?

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

Czytałem gdzieś, że Ale nie mogłem znaleźć wytłumaczenia dlaczego lub co dokładnie z tym zrobić.

Wszelkie pomysły?

EDIT - Oto odpowiedź wymyśliłem ...

Więc dodałem klasę „pojemnik” (z Get i Set < - bardzo ważne), aby uniknąć typy anonimowe będących ReadOnly Emisja:

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

i zmienił oświadczenie 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()); 

i to jest to! Dzięki za pomoc, Glenn!

Odpowiedz

5

Powodem, dla którego widok siatki danych jest w trybie Tylko do odczytu podczas wiązania z typami anonimowymi, jest to, że typy anonimowe to ReadOnly. To samo zachowanie pojawi się, jeśli powiązać widok z listą obiektów posiadających tylko właściwości tylko do odczytu.

Jedyne rozwiązanie, które znam, to utworzenie kontenera dla danych, które można edytować. Klasa z właściwościami definiującymi get i set da ci to, czego szukasz.

+0

@Glenn: Dzięki. To ma sens w mojej głowie. Chociaż wybaczam mi, że jestem nowicjuszem LINQ, ale wciąż staram się owijać głowę wokół tego, co dzieje się pod maską. Mylące jest dla mnie to, że wydawałoby się, że typ anonimowy nadal będzie zwracał odwołania do każdej wartości, tak, że gdy wartość w polu DataGridView zostanie zmieniona, dane XML w XDocument są jednocześnie zmieniane. Czyli mówisz, że jeśli stworzę klasę, która może zawierać te wartości, będę w stanie uzyskać to, czego szukam? – Pretzel

0

Jest to prawdopodobnie spowodowane ograniczeniem w C# 3 - nie można używać typów anonimowych jako typów zwracanych z metod. Zobacz na przykład: this

Powiązane problemy