绑定一个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类中定义的,所以,在列表中的每个对象有相同的定义。

我不认为这个问题,因为只要在列表中的一切至少一个元素正确绑定的,和正常工作。

+0

嗯,我从我自己的工作中知道IBindingList是那里最重要的一个。你是在你的集合类型上手动实现IBindingList,还是IBindingList ?在我自己的工作中,我也实现了ICancelAddNew,这非常有用。 – Nevyn 2012-08-01 21:18:41

+0

上面列出了继承类型的列表。我实现了IBindingList和ICancelAddNew。 IBindingList 是否可以解决空列表问题? – 2012-08-01 21:29:58

+0

您是在明确实现接口还是继承自BindingList ?我只是试着用BindingList 继承的自定义列表,它对空列表工作得很好。我会建议继承和重写。 – 2012-08-01 21:36:01

对于列表,它不是ICustomTypeDescriptor掌管,但ITypedList。在列表级别实现此功能,并且您可以在运行时根据需要提供属性。因为这不依赖于任何行,所以即使对于零行也应该工作。

+0

哇,很好的答案!我想知道BindingList 是如何神奇的,只要我读这个页面http://msdn.microsoft.com/en-us/library/ms404298.aspx详细说明ITypedList,并在我自己的自定义BindingList上实现了一切代码。 – 2012-08-01 21:54:26

+0

谢谢,让我试试... – 2012-08-01 21:56:29

+1

@DavidHall好吧,你需要注意 - 它比这更复杂:)如果它可以通过公共的非对象索引器识别可能的类型, SomeType this [int index] {get;}',那么如果没有ITypedList,它可以使用TypeDescriptor.GetProperties(typeof(SomeType)) - 这意味着TypeDescriptionProvider可能会*有机会干扰。 – 2012-08-01 21:58:31