2009-03-25 4 views
13

Я пытаюсь привязка к DataGridView в список, который содержит класс со следующей структурой:Winforms DataGridView DataBind к сложному типу/вложенной собственности

MyClass.SubClass.Property 

Когда я пошагово код, то SubClass никогда не просил ,

У меня нет ошибок, просто не вижу никаких данных.

Обратите внимание, что я могу привязывать данные в форме редактирования с одинаковой иерархией.

ответ

12

Law of Demeter.

Создайте свойство MyClass, которое предоставляет SubClass.Property. Вроде так:

+1

права, это был мой последний сценарий, но у меня есть 7 подтипов действительно занимаются, так что я искал лучший путь. Thx для наконечника, хотя. –

+0

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

3

Вы не можете привязать DataGridView к вложенным свойствам. Это не разрешено.

Одним из решений является использование этого ObjectBindingSource в качестве источника данных.

4

Вы можете добавить обработчик события DataBindingComplete и заполнить вложенные типы там. Что-то вроде этого:

в Form_Load:

dataGridView.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView_DataBindingComplete); 

позже в коде:

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

Это не хорошо, но работает.

+0

Это может быть быстрее, чем лить все ваши предметы подтипом до DataBind. – vizmi

0

Вы также можете использовать Linq!

Получите ваш общий список и использовать .select для выбора поля как ниже Exemple:

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(); 

}