0

在 VB .NET 函数的开头,我删除了一个事件处理程序并在函数末尾再次添加它,因为函数的代码会触发这些事件,我不希望它们在函数持续时间内触发。这通常有效,但我遇到了一些情况,即使我已经删除了该事件,它仍然会被调用。有时在函数开始时将其删除两次会修复它,但有时无论我删除多少次,它仍然会触发。关于可能导致这种情况的任何想法?

编辑

该代码位于具有虚拟模式 datagridview 的表单中。我想运行一些操作来触发 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

多次删除处理程序并不会阻止事件触发,因此它似乎不会在其他地方意外添加多次。

有没有办法找出哪些事件处理程序处于活动状态?

4

2 回答 2

1

如果正在调用事件处理代码,则发生以下两种情况之一:

  1. 您没有删除事件处理程序。

  2. 您正在多次添加事件处理程序。这是更常见的情况。

在过去,我能够发现 2. 的唯一方法是找到添加事件处理程序的所有位置(希望只有一两个)并在这些行上放置断点。然后我在调试器下运行该应用程序,发现它中断的次数比我预期的要多。我使用调用堆栈来找出原因 - 总是我将添加代码放在错误的位置(例如在按钮按下而不是在表单实例化上)。

您可以对删除代码执行相同的操作。计算每个断点被击中的次数,如果它们不同,则备份调用堆栈以查看是否可以找出原因。

于 2010-07-06T19:19:13.390 回答
0

在函数中使用类范围标志并检查事件处理程序中的标志。

IE:


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
于 2010-07-06T11:55:34.163 回答