Winform DataGridView数据绑定到复杂类型/嵌套属性

时间:2009-03-25 22:34:56

标签: c# .net data-binding datagridview .net-3.5

我正在尝试将DataGridView数据绑定到包含具有以下结构的类的列表:

MyClass.SubClass.Property

当我单步执行代码时,永远不会请求SubClass

我没有收到任何错误,只是看不到任何数据。

请注意,我可以在具有相同层次结构的编辑表单中进行数据绑定。

4 个答案:

答案 0 :(得分:12)

Law of Demeter

在MyClass上创建一个公开SubClass.Property的属性。像这样:

public class MyClass
{
   private SubClass _mySubClass;

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

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

答案 1 :(得分:4)

您可以向DataBindingComplete事件添加处理程序并在那里填充嵌套类型。 像这样:

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

这不好但是有效。

答案 2 :(得分:3)

您无法将DataGridView绑定到嵌套属性。这是不允许的。

一种解决方案是将此ObjectBindingSource用作数据源。

答案 3 :(得分:1)

您也可以使用Linq!

获取您的通用列表并使用.select选择以下字段中的字段:

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

}