在 VS 2008 (.Net 3.5) 中使用 C# WinForms
我正在尝试将一个可能为空的列表绑定到数据网格。
如果列表有元素,并且启用了 AutoGenerateColumns,则数据将绑定到列表并且一切正常。
但是,如果列表为空,或者列表为空(通过删除最后一个元素),则什么都不会显示,只有灰色背景。
如果我手动创建列,例如:
if (m_DataGrid.AutoGenerateColumns == false)
{
foreach (var pair in objData.PropertyDataTable
.Where(pair => pair.Value.IsNative == true
&& pair.Value.IsList == false))
{
string propertyName = pair.Key;
PropertyData propertyData = pair.Value;
if (propertyData.Type == typeof(bool))
{
var column = new DataGridViewCheckBoxColumn()
{
Name = propertyName,
HeaderText = propertyName,
DataPropertyName = propertyName,
ValueType = propertyData.Type,
};
m_DataGrid.Columns.Add(column);
}
else
{
var column = new DataGridViewTextBoxColumn()
{
Name = propertyName,
HeaderText = propertyName,
DataPropertyName = propertyName,
ValueType = propertyData.Type,
};
m_DataGrid.Columns.Add(column);
}
}
}
列出现,我可以添加一个新行,但数据实际上并没有绑定,并且没有像通常在自动生成列时那样填充行的默认值。
当我离开视图并返回时,添加的行仍然存在,但数据不会保留。
将自动生成的列与调试器中手动创建的列进行比较,两者之间唯一不同的属性是 DataGridViewColumn 基类上的IsDataBound属性。
当 AutoGenerateColumns 启用时,IsDataBound 设置为 true,列表中有一个或多个元素,但如果列表的初始元素为零,则为 false,尽管列的 DataPropertyName 属性已正确设置。
有没有办法将空列表绑定到数据网格,并允许用户在空白列表中添加行,并且所有内容都正确绑定?
我什至尝试在绑定之前将一个元素添加到一个空列表中,让它自动生成并绑定列......但是一旦删除了行,列就会消失并且绑定丢失。
其他实施细节:
我正在尝试绑定一个自定义列表/集合类型的数据源,该类型继承自:
- ICustomTypeDescriptor
- IBindingList
- ICancelAddNew
- IList<T>
- ICollection<T>
- IEnumerable<T>
- IList
- ICollection
- IEnumerable
列表中的对象是从ICustomTypeDescriptor继承的动态对象,并将属性映射到字典中的值。这些类型在 ObjectDefinition 类中定义,该类知道动态类型的可用属性信息(属性名称、类型、属性等...)每个列表都有一个分配给它的定义,因此列表中的每个对象都有相同的定义。
我不认为这很重要,因为只要列表中至少有一个元素,一切都会正确绑定,并且可以正常工作。