`
tubaluer
  • 浏览: 1435560 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

数据绑定应该使用 BindingSource 类 而不是使用ListControl.databingding

 
阅读更多


不使用 BindingSource 作为控件和基础数据源的中间层也行,但是 BindingSource 在很多时候非常有价值,这里只展示了一个很小的方面。

1. ListControl.DataSource 属性

获取或设置此 ListControl 的数据源。实现 IList 或 IListSource 接口的对象可以作为数据源,如 DataSet 或 Array。

假设现在有两个对象:List<T> 的 mylist,ListBox 类型的 listBox1。下面这条语句可以使 mylist 的内容显示到 listBox1 中(方法一):

listBox1.DataSource = mylist;

2. BindingSource 类

封装窗体的数据源。BindingSoiurce 实现的接口有:Component, IBindingListView, IBindingList, IList, ICollection, IEnumerable, ITypedList, ICancelAddNew, ISupportInitializeNotification, ISupportInitialize, ICurrencyManagerProvider。

假设现在还有一个 BindingSource 对象 bsrc ,下面的语句也可以使 mylist 的内容显示到 listBox1 中(方法二):

bsrc = new BindingSource(mylist, null);
listBox1.DataSource = bsrc;

3. 为什么需要 BindingSource ?

先看看 BindingSource 除了让控件知道从哪儿读取数据,还能做什么:

它通过提供一个间接寻址层、当前项管理、更改通知和其他服务简化了窗体中控件到数据的绑定。这是通过将 BindingSource 组件附加到数据源然后将窗体中的控件绑定到 BindingSource 组件来实现的。与数据的所有进一步交互,包括定位、排序、筛选和更新,都通过调用 BindingSource 组件实现。
值得注意的最后一句话,我在《对象引用的保护措施》中提出的“包装类”方案就是想让包装类做到这样。

总之,BindingSource 可以监视(直观地说是“监视”,本质上是“代理”)数据源的变化。在上面的方法一中,listBox1 不能跟踪 mylist 的变化,比如由这条语句引起的数据变更:

mylist.RemoveAt(3);
如果要让 listBox1 反应 mylist 的最新情况,需要:

listBox1.DataSource = null;
listBox1.DataSource = mylist;
或其它可以使 listBox1 与 mylist "从头开始"的语句


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics