2010-04-28 3 views
5

Je suis actuellement en train de faire LINQ-to-XML et de remplir un DataGridView avec ma requête très bien. Le problème que je rencontre est qu'une fois chargé dans le DataGridView, les valeurs semblent être Un-editable (ReadOnly). Voici mon code:LINQ-to-XML to DataGridView: Impossible d'éditer les champs - Comment réparer?

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

J'ai lu quelque part que le « DataGridView sera en mode lecture seule lorsque vous utilisez des types anonymes. » Mais je ne pouvais pas trouver une explication pourquoi ou exactement quoi faire à ce sujet.

Des idées?

EDIT - Voici la réponse que je suis venu avec ...

J'ajouté une classe « conteneur » (avec et ECRIRE < - très important) pour éviter les types anonymes étant ReadOnly question:

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

et a changé la déclaration 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()); 

et voilà! Merci pour l'aide, Glenn!

Répondre

5

La raison pour laquelle la vue de grille de données est en mode ReadOnly lors de la liaison à des types anonymes est que les types anonymes sont ReadOnly. Vous obtiendrez le même comportement si vous liez la vue à une liste d'objets avec uniquement des propriétés en lecture seule.

La seule solution que je connais est de créer un conteneur pour les données qui sont modifiables. Une classe avec des propriétés définissant un get et un set vous donnera ce que vous recherchez.

+0

@Glenn: Merci. Ce genre a du sens dans ma tête. Bien que pardonnez-moi d'être un débutant LINQ, mais je suis toujours en train d'essayer de comprendre ce qui se passe sous le capot. Ce qui me dérange, c'est qu'il semblerait qu'un type anonyme renverrait toujours des références à chaque valeur, de sorte que lorsque la valeur dans un champ de DataGridView est modifiée, les données XML dans le XDocument sont également modifiées en même temps. Donc dites-vous que si je crée une classe qui peut contenir ces valeurs, je serai capable d'obtenir ce que je cherche? – Pretzel

0

C'est probablement à cause de la limitation dans C# 3 - vous ne pouvez pas utiliser les types anonymes comme types de retour de méthodes. Voir par exemple this

Questions connexes