2008-09-24 9 views
34

Je suis en train de lier un List<T> à un contrôle DataGridView, et je n'ai aucune chance de créer des liaisons personnalisées.WinForms + DataGridView liaison à une liste <T>

J'ai essayé:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode")); 

Il jette une exception, en disant que rien n'a été trouvé par ce nom de la propriété.

Le nom de la colonne en question est "Opcode". Le nom de la propriété dans le List<T> est Opcode. : Le problème était que je n'avais pas les champs pouvant être liés dans ma classe en tant que propriétés, juste les champs publics ... Apparemment, il ne reflète pas les champs, juste les propriétés.

+0

LOL qui est juste ce que j'avais ajouté dans mes commentaires, heureux que vous avez été votre problème résolu. –

+2

+1 J'ai juste eu le même problème. L'homme qui suce les balles !!! –

+0

Vous êtes une aubaine. Je me suis battu la tête contre ce problème pendant six heures d'affilée, maintenant. J'ai essayé tout ce que je pouvais penser, et tout ce que je pouvais penser à Google. Pas de chance. Enfin trouvé votre poste et, bien sûr, j'étais pressé et fait les champs, pas les propriétés. – Locke

Répondre

14

La propriété sur la grille est-elle également liée à Opcode? .. Si vous voulez vous lier directement à List, vous devez juste DataSource = list. Les liens de données permettent une liaison personnalisée. essayez-vous de faire autre chose que la source de données?

Vous obtenez un tas de rangées vides? les colonnes générées automatiquement ont-elles des noms? Avez-vous vérifié que les données sont dans l'objet (pas seulement string.empty)?

class MyObject 
    { 
     public string Something { get; set; } 
     public string Text { get; set; } 
     public string Other { get; set; } 
    } 

    public Form1() 
    { 
     InitializeComponent(); 

     List<MyObject> myList = new List<MyObject>(); 

     for (int i = 0; i < 200; i++) 
     { 
      string num = i.ToString(); 
      myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num }); 
     } 

     dataGridView1.DataSource = myList; 
    } 

cela fonctionne bien ...

+0

Oui. Si je fais juste DataSource = liste, j'obtiens un tas de colonnes vides. – FlySwat

+1

Vous souhaitez simplement lier la grille à la propriété opcode dans une liste d'objets personnalisés? –

+0

Si ce que j'ai demandé est la distribution puis faire ... Grid.DataSource = MyList.Select (o => o.Opcode); –

5

Je ne peux pas vraiment dire ce que vous essayez de faire avec l'exemple que vous avez inclus, mais la liaison à une liste générique d'objets est assez simple si vous voulez juste la liste des objets:

private BindingSource _gridSource; 

    private BindingSource GridSource 
    { 
     get 
     { 
      if (_gridSource == null) 
       _gridSource = new BindingSource(); 
      return _gridSource; 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<FluffyBunny> list = new List<FluffyBunny>(); 
     list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" }); 
     list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" }); 
     list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" }); 

     GridSource.DataSource = list; 
     dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column 
     dataGridView1.DataSource = GridSource; 

    } 

Si vous souhaitez uniquement afficher les propriétés spécifiques du type de la liste, vous devriez être en mesure de faire la colonne non désirée (s) invisible.

Techniquement, vous n'avez pas vraiment besoin de créer BindingSource, mais je trouve que c'est beaucoup plus facile quand je fais des mises à jour ou des changements si je l'ai.

Espérons que cela aide.

+0

Lors de la liaison directe à la liste , je reçois un tas de lignes vides, pas de données. La classe de la liste contient seulement 3 chaînes. – FlySwat

+0

Merci Jared! Votre commentaire sur BindingSource m'a vraiment aidé lorsque j'ai essayé de comprendre comment créer de nouvelles lignes en utilisant une liste . Avoir un clic! –

+0

+1 pour des données intéressantes – SteveCav

4

Avait le même problème ... J'ai eu une structure avec les champs publics évidemment. rien dans la grille. fourni getters publics, travaillé.

+0

A travaillé pour moi! Tks – Pascal

3

Une autre solution que j'ai trouvée est d'utiliser la collection BindingList.



private void Form1_Load(object sender, EventArgs e) 
{ 
    BindingList people= new BindingList { 
    new Person {Name="John",Age=23}, 
    new Person {Name="Lucy",Age=16} 
    }; 

    dataGridView1.DataSource= people; 
} 

Il fonctionne très bien pour moi,