日期:2014-05-18  浏览次数:20844 次

[散分200][分享]郁闷大发了,有关BindingSource和IList<自定义>类型的绑定问题
郁闷大发了,有关BindingSource和IList<自定义>类型的绑定问题

原意是借助绑定机制实现主从表,在实际编码的时候发现自己实现主从表需要不断的来回判断和转换,一环扣一环,哪一环数据有修改都需要考虑,

我是在从个控件里使用Tag传值,但越写代码越多,我相信使用绑定机制一定可以简化,如果你不懂我在说什么,那有必要把我的实际需求说一说,

先简单点来三个控件吧,

一个TreeView,一个DataGridView,一个PropertyGrid三个控件,OK,简单吧,

还有两个成员,一个是自定义实体,一个是该自定义实体的IList<T>集合,好了,人都到齐了,开会吧,先讲讲需求,

TreeView中的子节点TreeNode都自带了实体,我把实体放到了TreeNode.Tag属性里了,OK,过

当点击该TreeNode的时候,牛一个新窗口,并将Tag传递过去,Frm.Tag = TreeNode.Tag,这里不管它是个啥吧,反正不转换了,使用的时候再说,过

牛的那个新窗口里有咱们的人,分别是DataGridView和PropertyGrid,它俩一个在上一个在下,OK,过

在新窗口的onload事件里,我们把接收来的Tag转换成实体对象,好像少说了一个条件,唉,就这么说吧,转换成实体对象后,再以该实体为参数到数据库里查询出一个IList<实体>集合出来,具体实现不说了,过

把那个实体集合绑定到咱们的DataGridView上,并处理DataGridView的OnRowEnter大概这么个事件里吧,就是当行被点击时的事件了,

得到该行的Index,取其DataItem,再将此DataItem交给PropertyGrid的SelectedObject,好像说得挺麻烦的,我是不是语言表述不清呀,

来张图看看吧,



能看清楚吗?左边就是咱们的TreeView,右边一上一下分别为DataGridView和PropertyGrid,

当鼠标点击DataGridView 其中一行时,PropertyGrid显示它的属性,过,

 

可算把事儿说清楚了,正文打此开始,

问题1,在PropertyGrid中修改实体属性时,DataGridView不自动更新,如何解决

好像就一个问题哈,

第一个思路是,当PropertyGrid属性有更改时(有这么个事件)得到该实体对象,然后再取DataGridView的实体集合对象,

遍历该集合对象,从中找到有修改的这个实体,并把它再放回去,刷新DataGridView的显示,说白了就是想让它自动显示修改后的数据而已,

但只允许在PropertyGrid中编辑,不允许在DataGridView里编辑,为啥嗫?我嫌它数据格式太多,处理起来麻烦,所以就想了这么一个招儿来对付

没跑题吧?说到哪了,想一想实现方法吓我一跳,太麻烦了,是啵?

而此时从外太空传来一声响亮的声音:为什么不使用BindingSource泥?

其实,我一直都相信使用BindingSource可以解决我上述的问题,但问题是老绑定不成功,提示这提示哪一着急,弃之不用,

再回来看看自己的实现方法,更着急,我该咋绑定嗫?

对了,咱的实体有名,叫DataFieldEntity,实体集合也有名,叫fields,好记吧,那咱们这么写绑定行不行看代码

BindingSource listBindingSource = new BindingSource( fields, "DataFieldEntity" );

欢天喜地的F5,直接异常,

在 DataSource 上未找到 DataMember 属性“DataFieldEntity”。

说自的DataMember指定不对,改改看,我实在是不知道这个该写个啥,咱的实体就那么几个属性,实体名称叫DataFieldEntity,哪,我的意思是说让它绑定集合,集合里的对象叫DataFieldEntity,可它就是听不懂,烦人

改了,改成Name看看

BindingSource listBindingSource = new BindingSource( fields, "Name" );

这回不闹腾了,没异常,可是啥也没显示!介孩子真犟驴

改成ID,跟上述情况一样麻木不仁,未见任何起色,

就这样,改来改去,怎么都绑定不上,最后万般无耐之时,我用了一个空值,""传进行了,你猜怎么着?!

显示出来了!为了使咱的代码更UYA(优雅那俩字用五笔太难打了)些,我用了个 string.Empty

至此,成功绑定了,而在可以在PropertyGrid中修改值时直接反映到DataGridView里了,关键是实现这个效果咱一分钱没花!完全由系统处理,high吧!

其实可以少写点的,只是这个问题陆陆续续拌了我好几天,不多写点对不起观众,对不起党,对不起人民,对不起CCTV,我说完了,都散了吧!啊,

等会儿等会儿,最关键的忘说了,

咱这么做有啥好处嘞?先说不这么做的好处吧,咱得改一个保存一个是吧,因为修改后的状态无法保存呀,这样改后

可以直接从DataGridView.DataSource as fields,得到一个集合,而且状态都是最新,可以一次更新回去,这样能省不少代码嘞,是吧


------解决方案--------------------
学习,Up
------解决方案--------------------
好长……待我慢慢看……
------解决方案--------------------
有实际帮助,up
------解决方案--------------------
行事件是可以获得绑定在该行的数据的
DataControlRowType.DataRow
------解决方案--------------------
mark
------解决方案--------------------
先mark 再看。
------解决方案--------------------
前来被点化
------解决方案--------------------
学习
------解决方案--------------------
mark
------解决方案--------------------
是不是和IPropertyChaned有关的问题啊,我没仔细看。但某个对象必须实现这个,不然无法执行更新通知,这在WPF上也是一样。
------解决方案--------------------