2010-04-28 10 views
5

Actualmente estoy haciendo LINQ-to-XML y llenando DataGridView con mi consulta muy bien. El problema al que me estoy enfrentando es que una vez cargados en DataGridView, los valores parecen no editables (ReadOnly). Aquí está mi código:LINQ-to-XML to DataGridView: No se pueden editar los campos - ¿Cómo corregirlos?

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

He leído en alguna parte que el "DataGridView estará en modo de sólo lectura cuando se utiliza Los tipos anónimos." Pero no pude encontrar una explicación de por qué o qué hacer exactamente al respecto.

¿Alguna idea?

EDITAR - Aquí está la respuesta que se me ocurrió ...

por lo que añade una clase de "contenedor" (con obtener y establecer < - muy importante) para evitar los tipos anónimos son de sólo lectura tema:

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

y cambió la declaración de LINQ a:

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

y eso es todo! Gracias por la ayuda, Glenn!

Respuesta

5

El motivo por el que la vista de cuadrícula de datos está en modo ReadOnly cuando se vincula a tipos anónimos es que los tipos anónimos son ReadOnly. Obtendrá el mismo comportamiento si vincula la vista a una lista de objetos con solo propiedades de solo lectura.

La única solución que conozco es crear un contenedor para los datos editables. Una clase con propiedades que definen un get y un set te dará lo que buscas.

+0

@Glenn: Gracias. Eso tiene sentido en mi cabeza. Aunque me perdonen por ser un novato de LINQ, pero todavía estoy tratando de entender lo que está pasando debajo del capó. Lo que me resulta confuso es que parecería que un tipo Anónimo aún devolvería referencias a cada valor, de modo que cuando el valor en un campo del DataGridView se modifique, los datos XML en el XDocument también se modifiquen simultáneamente. Entonces, ¿estás diciendo que si creo una clase que pueda contener esos valores, podré obtener lo que estoy buscando? – Pretzel

0

Probablemente se deba a una limitación en C# 3: no se pueden usar tipos anónimos como tipos de devolución de métodos. Ver por ejemplo this

Cuestiones relacionadas