我有一个CheckedBoxList。此外,我还附加了一个ItemCheck
事件,因此在我检查了一个项目后执行了功能。但问题是,在我的程序中的某一时刻,我需要以编程方式检查/取消检查项目。此操作会触发事件函数。
我的猜测也适用于其他控件。
如何防止此类行为?我需要仅在用户与它交互时才运行函数,而不是当我在应用程序内执行控制操作时。
您可以将对CheckedBoxList的所有更改包装在一个函数中,并每次使用该函数。代码可能如下所示:
private void UpdateCheckedListBox() // You would need to add your parameters
{
checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
// your changes to checked list box goes here
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
使用标志
private bool _updating;
void CheckedBoxList_ItemCheck(sender object, EventArgs e)
{
if (_updating) return;
// Execute item check code
}
void SomewhereElse()
{
_updating = true;
try {
// programmatically check/uncheck items
} finally {
_updating = false;
}
}
try/finally 语句确保即使发生异常或 try 代码块保留return
(或循环中的break
),该标志也不会设置。
首先在表单级别创建布尔变量:
bool dontUpdate = false;
然后在您的清单项检查方法中,仅在 dontUpdate 为 false 时才执行:
public void CheckedBoxList_ItemCheck(sender object, EventArgs e) {
if (dontUpdate) return;
//else execute
}
现在,以编程方式检查项目时,将其设置为 true:
void nativeUpdate(){
dontUpdate = true;
//Do your items check
dontUpdate = false;
}
每当需要以编程方式检查项目/S 时,请使用 nativeUpdate 方法。