posts - 432,  comments - 40,  views - 54万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

ComboBox最经常使用的事件就是SelectedIndexChanged。但在将ComboBox绑定到某个数据源的过程中,会触发SelectedIndexChanged
事件,而这个时候用户并没有选择内容,其SelectedValue也不是对应字段的值。那么时写在SelectedIndexChanged中的处理代码就会因为SelectedValue的内容不正确引发异常。
一般网上找到的方法是添加一个标记位,在绑定前设置为false,绑定完成后设置回true。

void BindComboBox()
{
    flag=false;
    ComboxBox1.ValueMember="ValueColumn";
    ComboxBox1.DisplayMember="DisplayColumn";
    ComboxBox1.DataSource=DataTable1;
    flag=true;
}
private void ComboxBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     if(flag)
     {
          //Do something
      }    
}

另外还有一种办法,就是在绑定前,将SelectedIndexChanged的委托去掉,等绑定完成后,再添加事件委托。

复制代码
void BindComboBox()
{          //去除委托
            ComboBox1.SelectedIndexChanged -= new EventHandler(ComboBox1_SelectedIndexChanged);            
            ComboBox1.DataSource = null;
            ComboBox1.ValueMember = "ValueColumn";           
            ComboBox1.DataSource = DataTable1;
            //添加委托 
            ComboBox1.SelectedIndexChanged += new EventHandler(ComboBox1_SelectedIndexChanged);
            ComboBox1.DisplayMember = "DisplayColumn";
}
复制代码

 

 

附录事件触发

l         SelectionChangeCommitted事件
在设定datasource和displaymember和valuemember时,以及手动改变combobox索引和值时都不触发该事件, 只是在界面选择combobox不同值时触发
2       SelectedIndexChanged事件  索引改变时触发
3         SelectedValueChanged事件   值改变时触发

设置DataSource, DisplayMember, ValueMember不同顺序触发SelectedIndexChanged事件和SelectedValueChanged事件的次数
顺序一:
this.comboBox1.DisplayMember = "userName";  (不触发)
this.comboBox1.ValueMember = "userAge";    (只触发SelectedValueChanged)

this.comboBox1.DataSource = dt; (都触发)
SelectedValueChanged触发两次(总是先触发)SelectedIndexChanged,触发一次 (设置DisplayMember属性时不触发两种事件)
顺序二:
this.comboBox1.ValueMember = "userAge";
this.comboBox1.DisplayMember = "userName";

this.comboBox1.DataSource = dt;
同上
顺序三:
this.comboBox1.DataSource = dt; (都触发)
this.comboBox1.DisplayMember = "userName";(都触发)
this.comboBox1.ValueMember = "userAge";(只触发SelectedValueChanged事件)
SelectedValueChanged触发三次(总是先触发)SelectedIndexChanged,触发两次 (设置DisplayMember属性时不触发两种事件)

顺序四:
this.comboBox1.DataSource = dt; (都触发)
this.comboBox1.ValueMember = "userAge";(都触发) 其中SelectedValueChanged触发两次
this.comboBox1.DisplayMember = "userName";(都触发)
SelectedValueChanged触发四次(总是先触发)SelectedIndexChanged,触发三次 (设置DisplayMember属性时不触发两种事件)

posted on   小石头的一天  阅读(1038)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2017-11-10 c# 多个事件公用一个相应方法判断事件来源
2016-11-10 字符串转换为字节序列,字母,汉字存储结构
点击右上角即可分享
微信分享提示