2014-09-21 129 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