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

kkun_3yue3 2009-02-25 10:06:51
郁闷大发了,有关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,得到一个集合,而且状态都是最新,可以一次更新回去,这样能省不少代码嘞,是吧
...全文
634 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
blc2003 2009-02-25
  • 打赏
  • 举报
回复
mark
readfuture 2009-02-25
  • 打赏
  • 举报
回复
嗯,有用,回去再好好看看
kkun_3yue3 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Dobzhansky 的回复:]
你的文字组织真是差劲儿

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

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

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

  string Name
  {

[/Quote]

不错!谢谢了,
不怕错,怕一直错着
悔说话的哑巴 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Dobzhansky 的回复:]
你的文字组织真是差劲儿

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

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

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

string N…
[/Quote]
呵呵,不要太直接
iwxiaot 2009-02-25
  • 打赏
  • 举报
回复
mark
Dobzhansky 2009-02-25
  • 打赏
  • 举报
回复
你的文字组织真是差劲儿

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

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

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

string Name
{
}

public event NameChanged
.....

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


zgke 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ojlovecd 的回复:]
好长……待我慢慢看……
[/Quote]

恩`~文字太多了.
kkun_3yue3 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 namhyuk 的回复:]
INotifyPropertyChanged
[/Quote]

那也要自己处理该事件,并把含有最新状态的实体再重新放到集合里,再赋给DataGridView的DataSource,这样还是要写代码滴,
现在就是不想自己实现这个逻辑了,让绑定机制自己实现,
我遇到的问题是不知道那个dataMember参数应该传什么,最终发现传空值即可

这个事件我也不甚了解,这就查资料去,呵呵,
namhyuk 2009-02-25
  • 打赏
  • 举报
回复
INotifyPropertyChanged
namhyuk 2009-02-25
  • 打赏
  • 举报
回复
是不是和IPropertyChaned有关的问题啊,我没仔细看。但某个对象必须实现这个,不然无法执行更新通知,这在WPF上也是一样。
kkun_3yue3 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyi8808 的回复:]
mark
[/Quote]

thank for 捧场,
可能这个问题有点冷门,
不过确实拌我好几天,
就为了少写那几行代码,
不愿意自己维护一个修改后的状态表
哈哈
wuyi8808 2009-02-25
  • 打赏
  • 举报
回复
mark
dayizhixiaotutu 2009-02-25
  • 打赏
  • 举报
回复
学习
kkun_3yue3 2009-02-25
  • 打赏
  • 举报
回复
简单理解就是
在实现主从表时,
所有的从表记录的修改后状态都可以在主表里保存,
这样可以直接从主表控件里拿到所有记录集合,
并且该记录集合的状态都是最新的,
可以批量更新,不然的话,必须自己保存修改后状态,而且只能一次保存一个,
wangzhe1945 2009-02-25
  • 打赏
  • 举报
回复
前来被点化
kkun_3yue3 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hhxxcj 的回复:]
行事件是可以获得绑定在该行的数据的
DataControlRowType.DataRow
[/Quote]

没错,不过我说的不是这个问题,
唉,偶语言组织能力太差了
abcyzq 2009-02-25
  • 打赏
  • 举报
回复
先mark 再看。
qinhl99 2009-02-25
  • 打赏
  • 举报
回复
mark
hhxxcj 2009-02-25
  • 打赏
  • 举报
回复
行事件是可以获得绑定在该行的数据的
DataControlRowType.DataRow
rollng 2009-02-25
  • 打赏
  • 举报
回复
有实际帮助,up
加载更多回复(36)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧