2014-09-21 172 views
0

我有一段代碼,我在每次打開窗體時都添加一個處理程序,我在Visual Basic中工作,但是第一次輸入窗體時一切正常,但第二次我有2個處理程序,如果我輸入第三個,我有3個處理程序,等等。我不知道爲什麼會發生這種事情。無法刪除事件處理程序,添加多次

這是我到目前爲止所嘗試的。

我已經存儲了我的另一個類中的所有機器,但我發送給myForm會向他們展示,而是將它們加入到我使用此代碼:

Private Sub add_machine(ByRef machine As Machine) 

    RemoveHandler machine.imgBox.Click, AddressOf Me.imgBox_Click 
    AddHandler machine.imgBox.Click, AddressOf Me.imgBox_Click 
    Me.Controls.Add(machine.get_imgMachine) 

    Private Sub imgBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)   
    'Some code 
    End Sub 

每次我打開窗體我稱之爲子add_machine到dinamically加我的機器,你可以看到我送他們ByRef簡化我的代碼我試圖把該RemoveHandler,因爲我送ByRef以避免一個以上的處理器,但它不工作,請幫助

謝謝提前。

+0

傳遞給這個函數的'machine'和以前的調用是否一樣?否則,這將無法工作。您需要取消訂閱以前的'machine'實例。 – 2014-09-21 13:10:17

+0

我覺得和'machine'一樣,因爲我有一個調用這個表單的按鈕,我的主表單總是打開的,那是我存儲機器的地方,我怎麼知道它是不是同一個實例。 – ocespedes 2014-09-21 13:41:39

+0

您已將此標籤標記爲VBA,但也許您的意思是Visual Basic?你看看:http://msdn.microsoft.com/en-us/library/6yyk8z93(v=vs.90).aspx – 2014-09-21 15:22:30

回答

2

兩件事情,不要通過機器ByRef。你沒有返回一個新的對象。請閱讀此鏈接以瞭解更多關於何時使用的信息。Byval vs ByRef

其次,在表單加載(或初始化)期間添加處理程序,並在表單關閉時將其刪除。這將有助於確保您正在處理對同一對象的引用。

+0

我沒有這樣想,現在感覺很蠢 – ocespedes 2014-09-22 17:56:41