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!
@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