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属性时不触发两种事件)