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

Posted

技术标签:

【中文标题】Winforms DataGridView 数据绑定到复杂类型/嵌套属性【英文标题】:Winforms DataGridView databind to complex type / nested property 【发布时间】:2010-10-15 14:09:27 【问题描述】:

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

MyClass.SubClass.Property

当我单步执行代码时,从未请求过SubClass

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

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

【问题讨论】:

【参考方案1】:

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;
      

【讨论】:

对,这是我的最后一个案例,但我有 7 个子类型需要处理,所以我正在寻找更好的方法。谢谢你的小费。 @BZ developer-corner.com/blog/2007/07/19/…【参考方案2】:

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

在表单加载中:

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;
    

这不是很好,但很有效。

【讨论】:

这可能比在数据绑定之前将所有项目转换为子类型更快。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

你也可以使用 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();


【讨论】:

以上是关于Winforms DataGridView 数据绑定到复杂类型/嵌套属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段

如何使用绑定到数据表的 c#winforms 保存我的 datagridview

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

用dataGridView将数据绑上去后,再修改其中的数据,sql语句测试正确,却改不了数据,为啥呢?

C# WinForms - DataGridView/SQL Compact - 主键列中的负整数

如何根据 c# winforms 中的列日期和名称将 sql 中的数据输入到特定的 datagridview 单元格中