BindingList的主要特点在于,它可以在加入新的元素或者元素发生修改的时候触发相应的事件,而在基本集合类中是不具有这些功能的,而且由于在基本集合中Add方法不是Virtual方法,要想让它触发事件还真不是很方便。不过BindingList可以很好的满足你的功能。
在Windows表单编程中,使用DataGridView可以很方便与数据库查询结果绑定,但是有时候查出来的数据需要经过一番处理才显示,这时候就不能直接绑定了。借助于BindingList,你便可以很方便得实现这个功能。
BindingList是一个泛型容器,可以直接赋值给DataGridView的DataSource。而且以后的数据变化,只需要维护BindingList里的东西就行了,DataGridView自动更新数据显示。
最近做项目中突然发现还有个BindingList可以使用。查了不少信息。得出底下几点结论:
压根不是同一样东西,从命名空间中就能发现,一个是Component下的东西。主要特点在于Component的相关。另一个是Collection命名空间下的产物。主要用于集合相关。
BindingList比List多的功能问为但他是GridView的数据源时,他有Allow.... Sort...等方法。从名字中可以看出对于该数据的一些约束。List比BindingList多的方法比如,AddRange方法,我之前项目中使用BindingList时需要将2个BindingList合并,却找不到方法。当然他可能有其他的方法而我不知道而已。
最后,BindingList和List并无任何关系不存在继承关系。个人建议,处理逻辑时用List,但作为数据源绑定是用BindingList.
使用BindingList绑定datagridview开发应用,只要如下即可:
BindingList<T> x = new BindingList<T>();
.... datagridivew1.datasource = x;
datagridiew1.columns["name'].DataPropertyName = "Name";
... T = datagridview1.selectedrows[0].boundItem as T;
列表控件的信息就可以和对象集合的信息“同步”,但经过检查发现,这个同步是单向的,列表控件数据变更或增加,可以通过事件通知到对象集合,而对象集合内的数据变更或增减列表控件无法变更,(后来试验了一下,有时需要对datagridview进行刷新才会更新,但对象增减应该可以同步)而且我在检查其代码时发现了如下有趣现象:
1. 如果列表控件使用了cellvalidating事件,在出现e.cancel=true时, 系统会经常报错,估计是后面的对象清单取消操作时的问题
2 . BindingList本身不具备排序功能,如果重写applysort方法,需要处理一堆问题.
所以简单的操作用bindinglist很方便,如果是复杂操作,可能就有问题。
https://www.cnblogs.com/louisding/archive/2011/01/18/2763702.html
https://blog.youkuaiyun.com/cxu123321/article/details/94986853