7
votes

Bind Liste des classes dans DataGridView

Je dois lier une liste myList code> à un DataGridView code>. Et entrez dans la table des résultats avec deux colonnes ID et nom Nom.

Code Snippets: P>

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


3 commentaires

Vous venez de poser la question exacte. Supprimer celui-ci. Et éditer le précédent si nécessaire. EDIT: Je vois que vous avez supprimé le précédent. Ce n'est pas la bonne manière que tout le monde qui a tenté de vous aider, les réponses sont maintenant parties.


Désolé .. La question précédente n'était pas correcte ..


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


4 Réponses :


0
votes

Non, vous ne pouvez pas le faire hors de la boîte. Vous devrez écrire une source de liaison personnalisée (la plus probable avec une logique spécialisée pour votre objectif spécifique) afin de permettre le «forage» plus profond que de 1 niveau de propriétés.


0 commentaires

2
votes

Pour ce faire sans changer le modèle est exceptionnellement fort> délicat (mais possible), nécessitant iCustomTypeScriptor code> ou TypedescriptionProvider code> et un personnalisé PropriétéDescriptor code>. Pour être honnête: ne vaut pas la peine.

Il suffit d'ajouter Pass-Thru Propriétés: P>

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


4 commentaires

Oui, cette solution a lieu :)


Hmmm, je n'ai jamais pensé à le faire directement via The Typedescriptor, il aurait peut-être été un peu plus facile que la route de liaison que j'ai prise :)


@Leppie - c'est toujours assez avancé, bien que


Surtout traiter des données récursives et un résultateur de 1000 des propriétés. Je devais limiter mes nids à 6 niveaux et à 600 pour empêcher le concepteur de DataGridView exploser. Apparemment, cela n'aime pas avoir plus de 650 colonnes (suffisamment drôle, c'est la facturation qui cause cette limitation, 100 * 660> 0xFFFF).



18
votes

Que diriez-vous de la liaison à un type anonyme:

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


2 commentaires

Wow, solution très élégante! Merci!


oui mal à mettre à jour. Que devrions nous faire ? (Pour plus de référence à d'autres utilisateurs.)



1
votes

C'est facile avec Linq comme vous pouvez le voir dans Cette réponse

Voici une simple mise en œuvre de quelque chose dont j'ai besoin pour joindre à DataGridView.

P>

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


0 commentaires