数据绑定是个非常有用的东东,经常在C 下写MVC结构程序的童鞋可能都苦于界面(View)和数据(Model)之间的一致,如果View单一而且需要做的一致性工作不多的话,我们经常会直接在Controller里写更新操作(如图1所示),而如果有多个View,数据同步复杂的话,经常需要手动实现一个观察者模式,每个对数据(Model)的原子操作都需要同时对View进行更新(如图2所示)。
![临时1][1]![临时3][2]
图1 图2
总的来说.Net平台设计还是非常优秀而人性化的,比如说数据绑定。数据绑定相当于自动实现了从Model到View的数据更新(如图3所示),而免去了自己管理数据一致和自己实现观察者模式的麻烦。同时,DataGridView控件的引入极大的方便了表格形式数据的显示和操作,这个比C 里德ListCtrl使用起来要方便很多。
![临时2][3]
图3
扯了好多无关的东东,该进入正题了。我们要探讨的是DataGridView控件绑定自定义数据结构的问题。我们要实现的目的是绑定到一个List的结构里,而T可以自己定义。具体的代码不贴了,参考文献1里有一个比较简明的例子。一个比较突出的问题是List没有实现ISort接口,所以绑定后无法自动排序,参考文献2里有相应的解决方法,其中封装的BindingCollection泛型类可以直接作为List泛型的替代品来使用。
本文主要探讨的问题是其中一个更小的问题。就是使用了BindingCollection之后绑定数据前后数据列会发生变化,如下所示:
![test][4] 可见顺序发生了变化,这里没有项的增加,但是如果有没加入的列,DataGridView会自动添加一个列,这个问题很讨厌啊。试了好久之后,从MSDN里查到一个属性AutoGenerateColumns,这个属性在属性编辑器里没有可视化的编辑项,但是可以通过代码设置,所以只需要设置
dataGridClient.AutoGenerateColumns = false;
即可避免此问题。