如何防止Checkbox Checkchanged事件在VB.Net中触发

时间:2018-06-22 07:38:21

标签: vb.net

我的一个函数中有这段代码

If DataServices.IsGroupByMe(test) = True Then
            chkGroup.Visible = True
            chkGroup.Checked = True
        Else
            chkGroup.Checked = False
            chkGroup.Visible = False
        End If

通过这条线

chkGroup.Checked = True

它会自动为该复选框调用我的checkchanged事件

 Private Sub chkGroupByMe_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkGroupOper.CheckedChanged
        LoadFilteredData()
    End Sub

然后破坏了通常执行的动作顺序。有什么方法可以防止触发checkchanged事件?

请注意基本形式的第一个功能。以及以其他子形式继承基数的checkchanged事件。

5 个答案:

答案 0 :(得分:1)

一种简单的方法是在设置事件处理器的值之前将其删除,然后重新分配它。

在设置检查值之前(或在函数开始时):

RemoveHandler chkGroup.CheckedChanged, AddressOf chkGroupByMe_CheckedChanged

在设置检查值之后(或在函数末尾):

AddHandler chkGroup.CheckedChanged, AddressOf chkGroupByMe_CheckedChanged

注意:每当您使用上述方法添加EventHandler时,请始终确保在其之前调用了相应的RemoveHandler。多次调用RemoveHandler不会有问题,但是事件处理太多次将使您有些头疼,想知道发生了什么。

答案 1 :(得分:1)

您可以简单地使用一个变量来阻止更新:

private bool PreventUpdate;

// your function
If DataServices.IsGroupByMe(test) = True Then
    PreventUpdate = true;
    // ... all tasks
   PreventUpdate = false;

// handler
Private Sub chkGroupByMe_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkGroupOper.CheckedChanged
    if not PreventUpdate Then
        LoadFilteredData()
    End Sub

答案 2 :(得分:1)

这很难回答,因为我们真的不知道表单的结构,每段代码都驻留在表单中,也不知道如何与它们交互。

但是,一种选择是您以基本形式创建一个Shared属性,该属性指示何时应绕开LoadFilterData()

以您的基本形式放置它:

Protected Shared Property BypassDataLoad As Boolean = False

然后在您的函数中执行以下操作:

If DataServices.IsGroupByMe(test) = True Then
    BaseForm.BypassDataLoad = True
    chkGroup.Visible = True
    chkGroup.Checked = True
    BaseForm.BypassDataLoad = False
Else
    BaseForm.BypassDataLoad = True
    chkGroup.Checked = False
    chkGroup.Visible = False
    BaseForm.BypassDataLoad = False
End If

...以及您的事件处理程序中:

Private Sub chkGroupByMe_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkGroupOper.CheckedChanged
    If Not BaseForm.BypassDataLoad Then
        LoadFilteredData()
    End If
End Sub

用基本表单类的实际名称替换BaseForm

答案 3 :(得分:0)

您可以在将Checked属性设置为true之前,使用RemoveHandler删除事件处理程序。然后,在其他情况下,如果将Checked属性设置为false,则可以使用AddHandler重新添加事件处理程序。这样,只要选中该选项,就会触发实际事件。

答案 4 :(得分:0)

您可以使用复选框的“标记”属性来控制“ CheckChanged”事件,而不必再次删除并重新添加处理程序。 请尝试以下代码:

If DataServices.IsGroupByMe(test) Then
    chkGroup.Tag = "0"
    chkGroup.Visible = True
    chkGroup.Checked = True
Else
    chkGroup.Tag = "0"
    chkGroup.Checked = False
    chkGroup.Visible = False
End If



Private Sub chkGroupByMe_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkGroupOper.CheckedChanged
    If chkGroup.Tag <> "0" Then
        LoadFilteredData()
    End If
    chkGroup.Tag = ""
End Sub