2009-03-25 10 views
13

Je suis en train de DataBind un DataGridView à une liste qui contient une classe avec la structure suivante:WinForms DataGridView DataBind à la propriété de type/imbriquée complexe

MyClass.SubClass.Property 

Lorsque je fais un pas dans le code, le SubClass est jamais demandé .

Je ne reçois aucune erreur, je ne vois aucune donnée.

Notez que je peux créer une base de données dans un formulaire d'édition avec la même hiérarchie.

Répondre

12

Law of Demeter.

Créez une propriété sur MyClass qui expose la propriété SubClass.Property. Comme suit:

public class MyClass 
{ 
    private SubClass _mySubClass; 

    public MyClass(SubClass subClass) 
    { 
     _mySubClass = subClass; 
    } 

    public PropertyType Property 
    { 
     get { return _subClass.Property;} 
    } 
} 
+1

droit, qui était mon dernier scénario, mais je 7 sous-types ne traiter que je si cherche meilleure façon. Merci pour le conseil. –

+0

@BZ http://www.developer-corner.com/blog/2007/07/19/datagridview-how-to-bind-nested-objects/ –

3

Vous ne pouvez pas lier un DataGridView à des propriétés imbriquées. Ce n'est pas autorisé.

Une solution consiste à utiliser cette ObjectBindingSource comme source de données.

4

Vous pouvez ajouter un gestionnaire à l'événement DataBindingComplete et y remplir les types imbriqués. Quelque chose comme ceci:

dans form_load:

dataGridView.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView_DataBindingComplete); 

plus tard dans le code:

void dataGridView_DataBindingComplete(object sender, 
     DataGridViewBindingCompleteEventArgs e) 
{ 
    foreach (DataGridViewRow row in dataGridView.Rows) 
    { 
     string consumerName = null; 
     consumerName = ((Operations.Anomaly)row.DataBoundItem).Consumer.Name; 
     row.Cells["Name"].Value = consumerName; 
    } 
} 

Il est pas beau, mais fonctionne.

+0

Il pourrait être plus rapide que de lancer tous vos éléments dans un sous-type avant databind. – vizmi

0

Vous pouvez également utiliser Linq!

Obtenez votre liste générique et utiliser .select pour choisir les champs comme le exemple ci-dessous:

var list = (your generic list).Select(i => new { i.idnfe, i.ide.cnf }).ToArray(); 

if (list .Length > 0) { 
     grid1.AutoGenerateColumns = false; 
     grid1.ColumnCount = 2; 

     grid1.Columns[0].Name = "Id"; 
     grid1.Columns[0].DataPropertyName = "idnfe"; 
     grid1.Columns[1].Name = "NumNfe"; 
     grid1.Columns[1].DataPropertyName = "cnf"; 

     grid1.DataSource = lista; 
     grid1.Refresh(); 

} 
Questions connexes