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语句测试正确,却改不了数据,为啥呢?