首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-01-18 
[散分200][分享]郁闷大发了,有关BindingSource和IList自定义类型的绑定问题郁闷大发了,有关BindingSourc

[散分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上也是一样。
------解决方案--------------------


INotifyPropertyChanged
[解决办法]

探讨
好长……待我慢慢看……

[解决办法]
你的文字组织真是差劲儿

.net 数据绑定不是万能的, 数据变更向界面更新, 正是通过 IPropertyChanged 来实现的,
数据绑定机制后台做了好多的基础工作的, 其中之一就是对数据源中数据对象属性变更事件的订阅.

你要使用数据绑定机制, 就要 fit in 这个架构, 如果自己发明其他的方式,
时间一久, 代码就变得很难看.

属性变更可以用 IPropertyChanged 接口, 也可以用 XXXChanged 范式(XXX是属性名),

string Name
{
}

public event NameChanged
.....

数据绑定机制 和 设计时架构 是两个 需要 fit in 的东东
不像其他(ado.net , gdi+..) 以 use 为主.



[解决办法]
mark
[解决办法]
探讨
你的文字组织真是差劲儿

.net 数据绑定不是万能的, 数据变更向界面更新, 正是通过 IPropertyChanged 来实现的,
数据绑定机制后台做了好多的基础工作的, 其中之一就是对数据源中数据对象属性变更事件的订阅.

你要使用数据绑定机制, 就要 fit in 这个架构, 如果自己发明其他的方式,
时间一久, 代码就变得很难看.

属性变更可以用 IPropertyChanged 接口, 也可以用 XXXChanged 范式(XXX是属性名),

string N…

[解决办法]
嗯,有用,回去再好好看看
[解决办法]
mark
[解决办法]
不懂,学习啊!
[解决办法]
谢谢楼主分享。暂时还没看懂,回去我好好研究下。呵呵
[解决办法]
关注...
[解决办法]
顶 关注中......
[解决办法]
mark
[解决办法]
关注
[解决办法]
mark 先 /
[解决办法]
绑定的层次问题:
1. 列表类的绑定, 并非 IList 这么简单, 要求列表可以新增, 可以排序, 可以过滤,.....
2. 对象单体的绑定, 涉及属性的变更通知等, 若要使用 propertygrid, 
自定义类型还要 typeconverter, uieditor

参考资料:
Addison Wesley - Data Binding with Windows Forms 2.0 Programming Smart Client Data Applications with .NET 2006.chm

windowsclient 上的数据绑定例子
databinding.zip(类似文件名) 好几个工程演示了绑定的方方面面, 还有一个不错的 word 文档.

[解决办法]
up
[解决办法]
mark先,进来解决问题的
[解决办法]
你可以声明一个静态集合,把值放到里面不就行了,用时取出,要一次行都做就放到循环中不就行了吗
[解决办法]
up
[解决办法]
路过...
[解决办法]
up
[解决办法]
看看
[解决办法]
学习了,接分!
[解决办法]
先顶帖,再细看
[解决办法]
见识,可能不来这儿,在我的职业生涯中都遇不到这样的问题!~


[解决办法]
ding
[解决办法]
学习了,谢谢楼主分享
[解决办法]
UP
[解决办法]
我是猎头公司的angel,目前有.net的相关需求,要求有5年以上的c#.net的相关经验,英文能进行英文面试,base:上海
感兴趣的请联系我
email:angel@jingjie-wisemen.com
msn: angel_lu@live.hk
[解决办法]
upupup

热点排行