事件处理不得不说的-别让事件无谓的触发
在winform编程过程中,事件处理是一件非常常见的编程活动,但是我发现在我的项目中经常出现不希望被执行的事件程序却经常被执行了,很常见的一个例子就是combobox的SelectedIndexChanged事件,这个事件的发生是在从combobox列表中选择了新项,处理这个事件的目的是希望在选择新项的时候做一些其他的处理,比如验证或者查询其他的数据。
在我们的程序又这样一个业务逻辑,不同的IDT的零部件,其作用代号和使用代号是随着IDT变化的。IDT作用代号和使用代号都是一个枚举值。因此在界面上便选择了ComboBox来显示三者的值,并使用了SelectedIndexChanged事件来实现其业务规则的约束。在数据创建的过程中,这个事件处理是没有问题的,问题是同样一个窗口既用来输入数据,也用来显示数据,同时也用来修改数据的时候事件的处理便存在问题。如查询一个零部件的属性的时候,其IDT、作用代号、使用代号已经存放到数据库中了,此时只需要显示出来就可以,然而由于没有做控制,所以IDT值变化的时候,同样会执行SelectedIndexChanged事件,相当于做了一次无用功,影响了程序的性能。
那么正确的做法是什么呢?下面提供一种控制策略供参考:
private bool isChanging = false;
private void cmbPartChart2_DropDownClosed(object sender, EventArgs e)
{
isChanging = true;
}
private void cmbPartChart2_SelectedIndexChanged(object sender, EventArgs e)
{
if (isChanging) //只有在选择发生变化的时候才激活事件
{
if (this.cmbPartChart2.SelectedIndex != -1)
{
mSelectionText = ((ListItem<string, string>)this.cmbPartChart2.SelectedItem).DispMember;
mSelectionValue = ((ListItem<string, string>)this.cmbPartChart2.SelectedItem).ValueMember;
}
if (_TySelectedIndexChanged != null)
{
_TySelectedIndexChanged(sender, e);
}
}
}
在我们的程序又这样一个业务逻辑,不同的IDT的零部件,其作用代号和使用代号是随着IDT变化的。IDT作用代号和使用代号都是一个枚举值。因此在界面上便选择了ComboBox来显示三者的值,并使用了SelectedIndexChanged事件来实现其业务规则的约束。在数据创建的过程中,这个事件处理是没有问题的,问题是同样一个窗口既用来输入数据,也用来显示数据,同时也用来修改数据的时候事件的处理便存在问题。如查询一个零部件的属性的时候,其IDT、作用代号、使用代号已经存放到数据库中了,此时只需要显示出来就可以,然而由于没有做控制,所以IDT值变化的时候,同样会执行SelectedIndexChanged事件,相当于做了一次无用功,影响了程序的性能。
那么正确的做法是什么呢?下面提供一种控制策略供参考:
private bool isChanging = false;
private void cmbPartChart2_DropDownClosed(object sender, EventArgs e)
{
isChanging = true;
}
private void cmbPartChart2_SelectedIndexChanged(object sender, EventArgs e)
{
if (isChanging) //只有在选择发生变化的时候才激活事件
{
if (this.cmbPartChart2.SelectedIndex != -1)
{
mSelectionText = ((ListItem<string, string>)this.cmbPartChart2.SelectedItem).DispMember;
mSelectionValue = ((ListItem<string, string>)this.cmbPartChart2.SelectedItem).ValueMember;
}
if (_TySelectedIndexChanged != null)
{
_TySelectedIndexChanged(sender, e);
}
}
}