如何防止以编程方式与控件交互后触发事件



我有一个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 方法。

最新更新