2010-07-05 46 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