ComboBox绑定DataTable数据,用户选中项后触发事件异常,之二!

本文讨论了在使用ComboBox组件时,如何避免在数据绑定过程中触发SelectedIndexChanged事件并导致异常的问题。通过引入标记位或移除事件委托的方法来实现事件的正确触发。同时,提供了在事件中判断ContainsFocus属性来确定是否由用户触发的解决方案。
摘要由CSDN通过智能技术生成

又遇到这个问题。

用之前的方法,SelectionChangeCommitted 还是有点小问题。

参考:之前的文章

继续搜索到:http://www.cnblogs.com/Bonizlee/archive/2011/05/24/2054942.html

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
}
}

这个方法涉及到 多一个变量 flag 每个窗体都要改动。

另外还有一种办法,就是在绑定前,将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";
}

委托呢,vb.net比较麻烦,跟何况初始化ComboBox是写到另外一个模块里面的函数里面。

两种方法都可以,但是之间的优劣暂时没去比较。感觉好像处理一下委托会好点。因为这种办法真的减少了事件的激发次数。

网友评论中的一个关键点:

    在事件中可以判斷 ContainsFocus 屬性來確定是否用戶觸發...先试一试看看。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值