Winforms DataGridView databind au type complexe / propriété nestede

J’essaie de lier une DataGridView à une liste qui contient une classe avec la structure suivante:

 MyClass.SubClass.Property 

Lorsque je parcours le code, la sous- SubClass n’est jamais demandée.

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

Notez que je peux dater des données dans un formulaire de modification avec la même hiérarchie.

Loi de Demeter .

Créez une propriété sur MyClass qui expose le SubClass.Property. Ainsi:

 public class MyClass { private SubClass _mySubClass; public MyClass(SubClass subClass) { _mySubClass = subClass; } public PropertyType Property { get { return _subClass.Property;} } } 

Vous pouvez append un gestionnaire à l’événement DataBindingComplete et y remplir les types nesteds. Quelque chose comme ça:

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) { ssortingng consumerName = null; consumerName = ((Operations.Anomaly)row.DataBoundItem).Consumer.Name; row.Cells["Name"].Value = consumerName; } } 

Ce n’est pas bien mais ça marche.

Vous ne pouvez pas lier un DataGridView à des propriétés nestedes. Ce n’est pas autorisé.

Une solution consiste à utiliser ObjectBindingSource en tant que source de données.

Vous pouvez aussi utiliser Linq!

Obtenez votre liste générique et utilisez .select pour choisir les champs tels que l’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(); }