2010-11-10 17 views
7

J'ai besoin de lier un List<MyClass> myList à un DataGridView. Et obtenir dans la table de résultats avec deux colonnes ID et nom.Lister la liste des classes dans DataGridView

extraits de code:

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

Est-il possible?

+0

Vous venez de poser la question exacte. Supprimez celui-ci. Et éditez le précédent si nécessaire. Edit: Je vois que vous avez supprimé le précédent. Ce n'est pas la bonne façon que tout le monde qui a tenté de vous aider, les réponses sont maintenant partis. – leppie

+0

Désolé ... la question précédente n'était pas correcte .. – Yuriy

+0

Oui, j'ai eu un downvote sans raison et vous avez supprimé la question. –

Répondre

17

Que diriez-vous lier à un type anonyme:

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

Serez-vous mettre à jour les données dans le datagridview?

+1

WOW, Solution très élégante! Merci! – Yuriy

+0

oui je vais être mise à jour. Que devrions nous faire ? (pour référence ultérieure à d'autres utilisateurs.) –

0

Non, vous ne pouvez pas faire cela hors de la boîte. Vous devrez écrire une source de liaison personnalisée (probablement avec une logique spécialisée pour votre objectif spécifique) pour permettre un 'forage' plus profond que juste un niveau de propriétés.

2

Pour faire cela sans changer le modèle est exceptionnellement délicate (mais possible), ce qui nécessite ICustomTypeDescriptor ou TypeDescriptionProvider, et une coutume PropertyDescriptor. Pour être honnête: ça ne vaut pas le coup.

ajouter juste pass-thru propriétés:

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

Oui, cette solution a lieu :) – Yuriy

+0

Hmmm, je n'ai jamais pensé à le faire directement via le TypeDescriptor, ça aurait pu être un peu plus facile que la route BindingSource que j'ai prise :) – leppie

+0

@leppie - c'est encore assez avancé, –

1

Il est facile avec LINQ comme vous pouvez le voir dans This answer

Voici une implémentation simple de quelque chose que je devais joindre à datagridview.

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