关于ListBox控件的一个很逗的错误:“设置DataSource属性后无法修改项集合。”

刚刚在Coding这样一个场景:用户勾选了某个复选框之后,将一个相关的下拉框中的某些项Remove掉。代码很简单就不贴出来了。没想到调试时报了一个“设置DataSource属性后无法修改项集合。”的错误,Google一下,原来是因为该下拉框是通过指定DataSource属性绑定的:

cbBox.DataSource = list;

有人解释说,在winForm程序中,如果这样绑定,是不允许对ListBox的项进行删除操作的。原因是因为这样绑定之后是直接和数据源DataTable相关,改动项会对DataTable造成影响。而解决办法是

1、修改绑定方式,不要直接指定DataSource属性,而是把数据拿出来一个一个添加到ListBox上去,将ListBoxDataTable脱离关系。

2、先把DataTable的对应行删掉,然后acceptchanges()就好了。

我没有查找这个问题的根源,不知道这是不是官方的解释。如果是的话那就太逗了,建议微软给设计该错误的哥们颁发一个“最佳幽默奖”——你焉知我指定DataSource属性就一定绑定到DataTable呢?我动态构造一个IList绑定不行吖?再说了,就算绑定到DataTable,就这样不允许删除ListBox的项也不太好罢。

posted on 2008-01-04 17:36 阿多斯 阅读(3073) 评论(15) 编辑 收藏

评论

#1楼 2008-01-04 17:49 Tant[未注册用户]

谁说ilist不能帮定的?  回复 引用   

#2楼 2008-01-04 17:58 随便说说[未注册用户]

我发现lz也挺逗,人家(datatable,ilist)的数据给你用就不错了,你凭什么想改人家的数据,要改数据你要通知数据的拥有者,你最多就是用用。  回复 引用   

#3楼 2008-01-04 18:12 egmkang      

对的对的
人家IList给你就是为了不让你删除,修改.
 回复 引用 查看   

#4楼 2008-01-04 18:26 远航      

楼主我看你才很逗呀.你怎么能通过ListBox去删数据源呢。  回复 引用 查看   

#5楼 2008-01-04 19:27 李华星      

哈哈, 这已经不是什么新鲜事了  回复 引用 查看   

#6楼[楼主] 2008-01-04 22:11 阿多斯      

呵呵,楼上诸位误会了。假设我要绑定到ListBox的并不是什么真正的“数据”源,而是在内存中构建的一个IList,<1,2,3,4,5>,通过指定DataSource属性的方法绑定到ListBox予以显示,就是这样
1
2
3
4
5
而绑定之后该IList就可以被销毁了。经过一些业务逻辑操作之后,需要去掉去中的偶数,让ListBox变成
1
3
5
那么,由于这个错误,就无法删除其中的2、4两个ListItem了。
因此,窃以为绑定之后,ListBox只是起到显示的作用,应该与背后的IList脱离关系,这样方便某些特定的业务操作,而现在这个错误表明,若要这样做,那事先就不能使用Datasource属性进行绑定。
这样的设计不太合理,是个小小的陷阱。
 回复 引用 查看   

#7楼 2008-01-08 10:26 Klesh Wong      

@阿多斯
呵,所谓“绑定”嘛,就是这么一回事
若是你说的那种需求场景,则不应该使用“绑定”
何苦还动态构建多一个ILIST?直接生成Item Add 到ListBox才是正道哇
 回复 引用 查看   

#8楼 2008-04-30 11:31 chh1203[未注册用户]

同意楼主观点,不一定删除就是添加也不行  回复 引用   

#9楼 2008-05-14 10:30 tg[未注册用户]

确实如 LZ所说,在使用了DataSource邦定了ListBox或者CombBox后就无法对ListBox中的任何项目进行任何操作,如果是联动 的ListBox就很痛苦了在SelectIndexChange事件中想重新邦定都不行,不能像WedForm中的ListBox那样可以很方便的来操作ListBox
不过有一点好处就是我们在WinForm中使用DataSource邦定了ListBox以后可以直接从DataSource中得到我们邦定的数据源,可是在WebForm中则不行。
 回复 引用   

#10楼 2008-05-24 02:36 fuadam[未注册用户]

这个问题可以解决
http://blog.csdn.net/fuadam/archive/2008/05/24/2475912.aspx
 回复 引用   

#11楼 2008-06-28 16:23 三晋一枝花      

@fuadam
这个办法我看过了,太复杂,没有这个必要;
我的程序中也大量用到了,但我一直没有搞明白,有的地方正常,而有的地方不正常,看代码,好象代码都一样,而且同样的代码,在两个窗体中也有不同。

我的代码大致如下:
cmb1.SelectIndexChaged事件:
cmb2.DataSource=Nothing
cmb2.DataSource=AAA

这样就可以了,注意加一些错误处理。

但有的窗体中出现这样的错误:cmb2绑定是绑定上了,但没有正常显示,所有的项显示都为空,但如果对cmb2进行操作,也正常,也就是说他的项加载的没错,但就是显示有问题。

还希望大家再讨论一下。
你的那个连接我看了,太复杂;不是好的解决办法
 回复 引用 查看   

#12楼 2008-07-12 15:50 inshua[未注册用户]

確實很搞笑,我有一個 combo,綁定的是 Text,兄弟們,Text,不是ListTable 綁定,它竟然也告訴我 “设置 DataSource 属性后无法修改项集合。”  回复 引用   

#13楼 2008-08-23 16:57 xqd[未注册用户]

再次绑定之前加一句话就行了:
this.listboxname.datasource = null;
 回复 引用   

#14楼 2009-02-23 12:25 看不下去[未注册用户]

To 2,3,4楼

你们说的也太冲了,不过事实证明这个设计是不合理的。
vs2005 就有了bindSource的类来支持lz所说的。
也换句话说,你们只是代码程序员,只会认死理。
 回复 引用   

#15楼 2009-05-27 23:44 咸鱼翻身      

能够发现问题解决问题才是关键。  回复 引用 查看   

导航

公告

 念念之中,不思前境。
 若前念、今念、后念,
 念念相续不断,名为系缚。
 于诸法上,念念不住,
 即无缚也。
          ——坛经·定慧品

 
 
  Locations of visitors to this page
昵称:阿多斯
园龄:5年1个月
粉丝:6
关注:0
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

搜索

 
 

常用链接

随笔分类

随笔档案

My Friends' Blog

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜