首先,测试几个模块里分别添加如下几行:
int id = convert.toint32(cbocategory.selectedvalue);messagebox.show(id.tostring());
1.在cbocategory_selectedindexchanged() cbocategory_selectedvaluechanged()中添加,编译无法通过,报错如下:
无法将类型为“myproject.model.category”的对象强制转换为类型“system.iconvertible”。
2.在普通方法或者load事件里,添加,则可以正常通过。
(原创内容,elig首发于博客园,转载请注明出处)
然后,测试代码改为如下:
category id = (category)(cbocategory.selectedvalue);if (id == null){ messagebox.show("test");}
1.在普通方法里调用,第一行可以正确编译通过,id == null 条件成立
2.在load事件,以及selectionchangecommitted,selectedindexchanged,selectedvaluechanged事件里,都报错如下:
无法将类型为“system.int32”的对象强制转换为类型“myproject.model.category”。
最后,测试如下代码:
messagebox.show(cbocategory.selectedindex.gettype().tostring());string str = cbocategory.selectedvalue.tostring();messagebox.show(str);int id = convert.toint32(str);messagebox.show(id.tostring());
1.load事件 普通方法 以及 selectionchangecommitted事件 都可以得到预期结果。
type : system.int32
2.而selectionchangecommitted,selectedindexchanged事件里
type : system.int32
str = myproject.model.category
转int后出错
(原创内容,elig首发于博客园,转载请注明出处)
虽然当时没有想明白问题到底出在哪里,但是解决方法就是上面提到的,把需要实现的代码写到selectionchangecommitted事件里,就可以正常地得到预期的结果。
项目结束后花了点时间仔细研究了下这个问题,因为同样的代码放在不同的地方却会出现如此丰富多彩的结果,实在让人忍不住。
最后发现,我们如果在selectedindexchanged,selectedvaluechanged两者任意一个事件里,把测试代码加到如下if判断里:
view sourceprint?1
if (cbocategory.selectedindex >= 1){//测试代码}
那么3个事件都能正常编译通过。
注意:问题就出在这个红色的1上,在selectedindexchanged,selectedvaluechanged里,只能判断到index >= 1
有人就要问了,combobox的index不是从0开始的吗?
非常正确!
但是只要把条件改为 >= 0 那么窗体加载时必定报错。
我们来看看这3个事件的区别:
selectedindexchanged,selectedvaluechanged是在任何情况下,只要改变了它们监视的值(index或者valuemember)就会触发对应事件
而我们都知道,在控件生成的时候,这2个值不可避免地要发生改变。也就是说,每次改变都会触发这个事件。
而selectionchangecommitted事件,官方的翻译解释是:当从下拉列表中选择项而下拉列表关闭时发生。
但是实际是这个翻译是不准确的,因为我装的不是英文的vs环境,所以无从知晓原文如何,但是实际上,该事件个人理解,更准确的翻译是,用户对该控件的选择项作出任何改变时发生。
这个“任何”包括:鼠标点击,获得焦点的情况下方向键上下选择。
(原创内容,elig首发于博客园,转载请注明出处)
在我的问题中,selectedindexchanged,selectedvaluechanged无法正确运作,是因为同样的代码在这两个事件中,无法对index = 0的item做处理,或者说selectedvalue的值不明确。从index = 1开始,selectedvalue的(int)转换非常正常。但是正因为这两个事件连系统对combobox控件作出的改动都会监视,所以不可避免的会在生成第一行的时候即触发事件,导致接触到不正常的index = 0的行。