我的一个函数中有这段代码
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事件。
答案 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