2009-12-10 35 views
1

我有以下类一个DataGrid绑定到对象的列表时:添加记录在一个WinForms应用程序

public class MyItems : List<MyItem> 
{ 
... 
} 

public class MyItem 
{ 
... 
} 

我实例化MyItems并将其分配给一个WinForms DataGrid的DataSource属性。

一切正常显示,但是当我尝试添加行时,没有任何反应。我所做的是将网格DataSource返回给MyItems,向其添加MyItems实例,然后将DataSource设置回列表。我可以遍历代码,看到数据源中项目的数量正在增加,但网格不显示它们。有任何想法吗?

//Form Load 
MyItems lstItems = new MyItems(); 
lstItems.Add(new MyItem("1")); 
lstItems.Add(new MyItem("2")); 

//Grid displays two rows; 
grd.DataSource = lstItems; 

//Add button click event 
MyItems lstItmes = (MyItems)grd.DataSource; 
lstItems.Add(new MyItem("3")); 

//Grid does not display new row 
grd.DataSource = lstItems; 

回答

3

为了更改对数据源展现出来,它必须实现System.ComponentModel.IBindingList接口。这是提供ListChanged事件的接口,这是网格为了发现列表(添加和删除项目)或行(更改属性值)的更改而挂钩的接口。

此外,ITypedList接口允许设计人员发现属性以及网格如何执行数据绑定,并且性能比基于反射的绑定更好。

如果您只是在寻找基本通知,并且您的基类已经继承了类似List<T>之类的内容,请尝试将父级更改为System.ComponentModel.BindingList<T>。这已经实现了IBindingList接口。如果您想要排序或支持属性更改通知等更高级的功能,则必须进行更多的工作,但它提供了基本添加和删除的实现。

相关问题