2010-07-05 36 views
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 

多次移除处理程序并不能防止事件被触发,所以它似乎不会在别的地方偶然多次添加。

有没有办法找出哪些事件处理程序是活动的?

+0

如果您发布代码,应该会更容易帮助您。 – 2010-07-05 20:14:18

+0

这是真的,但我不知道要发布什么,因为我不知道问题出在哪里,程序非常大。我更想知道是否有其他人遇到过这个问题,以及为他们解决了什么问题。 – davidscolgan 2010-07-05 20:23:45

+0

尽管如此,您至少可以发布您正在讨论的特定功能的代码。 – 2010-07-06 03:24:23

回答

1

如果被调用的事件处理代码,那么一两件事情正在发生:

  1. 你是不是删除事件处理程序。

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

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

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

0

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

即:


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