【问题标题】:Prevent circular event chaining on UI controls when updated programmatically以编程方式更新时防止 UI 控件上的循环事件链
【发布时间】:2011-11-19 11:25:52
【问题描述】:
我有一个 CheckedListBox,其中包含许多可以单独选中或取消选中的项目。
在这旁边是代表许多相对项目的超集的复选框。这些是三态的,对应于它们的项目的哪一部分被选中。
CheckedListBox 和单个 CheckBox 都订阅检查导致循环引用和溢出的更改类型事件。如何在另一个以编程方式更新它时禁用一个接收更改事件?
【问题讨论】:
标签:
c#
.net
events
checkbox
checkedlistbox
【解决方案1】:
void checkBox1_N_CheckStateChanged(object sender, EventArgs e) {
checkedListBox1.ItemCheck -= this.CheckedListBox1_ItemCheck;
// Handler body where affecting CheckedListBox1.
checkedListBox1.ItemCheck += this.CheckedListBox1_ItemCheck;
}
最好在对方更新时禁用对方的事件处理程序。
void CheckedListBox1_ItemCheck(object sender, EventArgs e) {
//Find which 'i' is affected.
arrOfCBox[i].cb.CheckStateChanged -= arrOfCBox[i].eh;
// Handler body where affecting checkBox[i].
arrOfCBox[i].cb.CheckStateChanged += arrOfCBox[i].eh;
}
BoxHandler 至少在哪里:
class BoxHandler
{
public EventHandler eh;
public CheckBox cb;
}
类似于WinForms: temporarily disable an event handler,但令人惊讶的是,它没有得到答案,(太抽象了?)。