asp.net c# ComboBox的SelectedValue 详解

作者:袖梨 2022-06-25

首先,测试几个模块里分别添加如下几行:

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的行。

相关文章

精彩推荐