【问题标题】:Event handler not removing itself?事件处理程序不会自行删除?
【发布时间】:2010-07-05 19:58:52
【问题描述】:

在 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

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

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

【问题讨论】:

  • 如果你把代码贴出来,应该更容易帮到你。
  • 确实如此,但我真的不知道该发布什么,因为我不知道问题出在哪里,而且程序很大。我只是想知道是否有其他人以前遇到过这个问题,以及是什么为他们解决了这个问题。
  • 不过,您至少可以发布您正在谈论的特定功能的代码。

标签: vb.net event-handling virtualmode


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    在函数中使用类作用域标志并在事件处理程序中检查标志。

    即:

    
    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-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多