隐藏事件处理程序

时间:2011-05-04 15:28:32

标签: vb.net winforms events

我有两个Windows窗体类,一个基类和一个派生类。基类有一个事件处理程序,它在某个组件上处理ValueChanged。我还为派生类上的同一事件编写了一个不同的事件处理程序。

当我创建派生类的实例并触发事件时,我发现两个事件处理程序都运行(基类1,然后是派生类1)。但是我只希望运行派生类中的处理程序。

这可能吗?如果可以,我该怎么做?

(这是.NET 3.5) 谢谢!

编辑:这是代码的样子(无法发布实际代码):

Public Class BaseForm
    Inherits System.Windows.Forms.UserControl

(Windows Form Designer Generated Code)

    Private WithEvents myControl As New SomeOtherControl
    Protected value As String

    Private Sub myControl_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles myControl.ValueChanged
        value = SomeLogic()
    End Sub
End Class  


Public Class DerivedForm
    Inherits BaseForm

    Private WithEvents myControl As New SomeOtherControl

    Private Sub myControl_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles myControl.ValueChanged
        value = myControl.Value
    End Sub
End Class

2 个答案:

答案 0 :(得分:0)

我不相信你可以控制它。

如果是我,我想我会像你一样拦截基类中的事件,然后从基类中定义一个ANOTHER事件,并从基类中的事件处理程序中引发该事件。

返回时,如果事件被处理(可能是你的派生类),那么只需退出基本事件处理程序,否则,继续进行基本事件处理。

答案 1 :(得分:0)

您可以将多个处理程序附加到一个事件,因此您所看到的是设计(您有两个处理程序连接到同一事件,因此它们都会触发)。

据说有办法完成你想要做的事情。一种方法是将代码从基类处理程序移到可覆盖的方法中,然后在派生类中重写该方法。所以你的基类处理程序只有一行代码,调用你所做的新方法。如果你继承自类,它将调用你的重写方法。

Public Class BaseForm
    Private Sub myControl_ValueChanged() Handles myControl.ValueChanged
        DoSomeLogic()
    End Sub
    Protected Overridable Sub DoSomeLogic()
    'original logic here
    End Sub
End Class  

Public Class ChildForm
    Inherits BaseForm
    Protected Overrides Sub DoSomeLogic()
    'other logic here
    End Sub

End Class