2010-11-10 13 views
7

Necesito vincular un List<MyClass> myList a un DataGridView. Y entra en la tabla de resultados con dos columnas ID y Nombre.Enlazar lista de clases en DataGridView

Los fragmentos de código:

private List<MyClass> myList = new List<MyClass>(){...}; 

public void BindClass() 
{ 
    dataGridView.DataSource = myList; 
} 

public MyClass 
{ 
    public MyDataClass Data{ get; set; } 
} 

public MyDataClass 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

¿Es posible?

+0

Sólo hizo la pregunta exacta. Eliminar este. Y edite el anterior si es necesario. Editar: Veo que eliminaste el anterior. Esa no es la forma correcta ya que todos los que intentaron ayudarlo, las respuestas ahora se han ido. – leppie

+0

Lo sentimos ... la pregunta anterior no era correcta. – Yuriy

+0

Sí, recibí un voto negativo sin motivo y usted eliminó la pregunta. –

Respuesta

17

¿Qué hay de unión a un tipo anónimo:

public void BindClass() 
{ 
    dataGridView1.DataSource = myList.Select(myClass => new {myClass.Data.ID, myClass.Data.Name}).ToList(); 
} 

¿Va a actualizar los datos en el DataGridView?

+1

¡GUAU, solución muy elegante! ¡Gracias! – Yuriy

+0

sí, será una actualización. Qué debemos hacer ? (para referencia adicional a otros usuarios) –

0

No, no puede hacerlo de la caja. Tendrá que escribir un origen de enlace personalizado (muy probablemente con una lógica especializada para su propósito específico) para permitir 'profundizar' más allá de solo 1 nivel de propiedades.

2

hacerlo sin cambiar el modelo es excepcionalmente complicado (pero posible), lo que requiere ICustomTypeDescriptor o TypeDescriptionProvider, y una costumbre PropertyDescriptor. Para ser honesto: no vale la pena.

Sólo tiene que añadir paso a través propiedades:

public MyClass 
{ 
    public MyDataClass Data{get; set;} 
    [DisplayName("ID")] 
    public string DataID { 
    get {return Data.ID;} 
    set {Data.ID = value;} 
    } 
    [DisplayName("Name")] 
    public string DataName { 
    get {return Data.Name;} 
    set {Data.Name = value;} 
    } 
} 
+0

Sí, tiene lugar esta solución :) – Yuriy

+0

Hmmm, nunca pensé en hacer esto directamente a través del TypeDescriptor, podría haber sido un poco más fácil que la ruta BindingSource que tomé :) – leppie

+0

@leppie - todavía es bastante avanzado, aunque –

1

Es fácil con LINQ como se puede ver en This answer

Aquí es una implementación sencilla de algo que necesitaba para unir a DataGridView.

 DataGridView1.DataSource = _ 
(From i In ItemList Select i.ListID, i.FullName, i.PurchaseDesc, i.EditSequence).ToList 
Cuestiones relacionadas