事件处理程序不删除自身?

时间:2010-07-05 19:58:52

标签: vb.net event-handling virtualmode

在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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  3. 在过去,我能够发现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