2010-11-10 7 views
7

Ho bisogno di associare un List<MyClass> myList a un DataGridView. E ottieni la tabella dei risultati con due colonne ID e Nome.Associa elenco di classi in DataGridView

frammenti di codice:

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

E 'possibile?

+0

Hai appena fatto la domanda esatta. Elimina questo. E modifica il precedente, se necessario. Modifica: vedo che hai eliminato il precedente. Non è il modo corretto in cui tutti quelli che hanno tentato di aiutarti, le risposte non sono più disponibili. – leppie

+0

Scusa .. la domanda precedente non era corretta .. – Yuriy

+0

Sì, ho ottenuto un downvote senza motivo e hai eliminato la domanda. –

risposta

17

ne dite di legame con un tipo anonimo:

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

si sarà l'aggiornamento dei dati nel datagridview?

+1

WOW, soluzione molto elegante! Grazie! – Yuriy

+0

sì mal si sta aggiornando. cosa dovremmo fare ? (per ulteriori riferimenti ad altri utenti.) –

0

No, non è possibile farlo fuori dalla scatola. Dovrai scrivere una fonte di binding personalizzata (molto probabilmente con una logica specializzata per il tuo scopo specifico) per consentire la 'perforazione' più profonda di un solo livello di proprietà.

2

di farlo senza cambiare il modello è eccezionalmente difficile (ma possibile), richiedendo ICustomTypeDescriptor o TypeDescriptionProvider, e un costume PropertyDescriptor. Ad essere onesti: non ne vale la pena.

Basta aggiungere pass-thru proprietà:

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ì, questa soluzione ha luogo :) – Yuriy

+0

Hmmm, non ho mai pensato di farlo direttamente tramite TypeDescriptor, potrebbe essere stato un po 'più semplice della rotta BindingSource che ho scattato :) – leppie

+0

@leppie - è ancora roba abbastanza avanzata, anche se –

1

È facile con LINQ come si può vedere nel This answer

Ecco una semplice implementazione di qualcosa che ho bisogno di allegare al datagridview.

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