绑定一个DataGridView到IBindingList的可能含有零个元素
在VS 2008中使用C#的WinForms(.NET 3.5)绑定一个DataGridView到IBindingList的可能含有零个元素
我想绑定列表,可能为空,到数据网格。
如果列表中的元素,和的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并且列表中有一个或多个元素但为false时,IsDataBound被设置为true,即使该列的DataPropertyName属性被正确设置,该列表也具有零初始元素。
有什么办法可以将空列表绑定到数据网格,并允许用户将行添加到空白列表中,并将所有内容正确绑定?
我甚至试图在绑定之前向空列表中添加一个元素,让它自动生成并绑定列......但是一旦行被移除,列就会消失,绑定也会丢失。
其他实施细则:
我想这是一个继承自定义列表/收藏型数据源绑定来自:
- ICustomTypeDescriptor
- IBindingList
- ICancelAddNew
- IList<T>
- ICollection<T>
- IEnumerable<T>
- IList
- ICollection
- IEnumerable
在列表中的对象是从继承的动态对象ICustomTypeDescriptor,和地图属性在字典中的值。该类型是在知道了动态类型可用的属性信息(属性名称,类型,属性等) 每个列表具有分配给它一个定义的ObjectDefinition类中定义的,所以,在列表中的每个对象有相同的定义。
我不认为这个问题,因为只要在列表中的一切至少一个元素正确绑定的,和正常工作。
对于列表,它不是ICustomTypeDescriptor掌管,但ITypedList。在列表级别实现此功能,并且您可以在运行时根据需要提供属性。因为这不依赖于任何行,所以即使对于零行也应该工作。
哇,很好的答案!我想知道BindingList
谢谢,让我试试... – 2012-08-01 21:56:29
@DavidHall好吧,你需要注意 - 它比这更复杂:)如果它可以通过公共的非对象索引器识别可能的类型, SomeType this [int index] {get;}',那么如果没有ITypedList,它可以使用TypeDescriptor.GetProperties(typeof(SomeType)) - 这意味着TypeDescriptionProvider可能会*有机会干扰。 – 2012-08-01 21:58:31
嗯,我从我自己的工作中知道IBindingList是那里最重要的一个。你是在你的集合类型上手动实现IBindingList,还是IBindingList?在我自己的工作中,我也实现了ICancelAddNew,这非常有用。 –
Nevyn
2012-08-01 21:18:41
上面列出了继承类型的列表。我实现了IBindingList和ICancelAddNew。 IBindingList是否可以解决空列表问题? –
2012-08-01 21:29:58
您是在明确实现接口还是继承自BindingList?我只是试着用BindingList 继承的自定义列表,它对空列表工作得很好。我会建议继承和重写。 –
2012-08-01 21:36:01