在VB .NET函数的开头,我删除了一个事件处理程序并在函数末尾再次添加它,因为函数的代码会触发这些事件,我不希望它们在函数的持续时间内触发。这通常有效,但我遇到了一些情况,即使我已经删除它,事件仍然会被调用。有时在函数开头删除它会修复它,但有时候无论我删除它多少次,它仍然会触发。关于可能导致这种情况的任何想法?
修改的
代码位于具有虚拟模式datagridview的Form中。我想运行一些操作来触发datagridview的CellValueNeeded事件,而不会触发该事件(因为它会干扰)。
Public Sub DoEventRaisingStuff()
RemoveHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded
'Do things that would trigger CellValueNeeded
AddHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded
End Sub
多次删除处理程序并不会阻止事件触发,因此似乎不会在其他地方偶然添加多次。
有没有办法找出哪些事件处理程序处于活动状态?
答案 0 :(得分:1)
如果正在调用事件处理代码,则会发生以下两种情况之一:
您没有删除事件处理程序。
您要多次添加事件处理程序。这是更常见的情况。
在过去,我能够发现2的唯一方法是找到添加事件处理程序的所有位置(希望只有一个或两个)并在这些行上放置断点。然后我在调试器下运行应用程序,发现它比我预期的多打破。我使用调用堆栈来解决原因 - 我总是将添加代码放在错误的位置(例如按下按钮而不是表单实例化)。
您可以使用删除代码执行相同的操作。计算每个断点被击中的次数,如果它们不同,则备份调用堆栈以查看是否可以找出原因。
答案 1 :(得分:0)
在函数中使用class scoped标志并检查事件处理程序中的标志。
即:
Private RunFunction as Boolean = False
...
Private Sub MyEvent(e as system.eventargs) handles myObject.Method
If RunFunction Then
...
End If
End Sub
...
Private Sub MyFunction()
RunFunction = False
...
RunFunction = True
End Sub