Vb.net 抽象类的事件处理

Vb.net 抽象类的事件处理,vb.net,events,raiseevent,Vb.net,Events,Raiseevent,基本上,我有一个自定义的子窗体类,它包含将传递给父窗体的事件。在自定义子窗体中,我有一个“MustInherit”类的声明,该类继承了DevExpress用户控件类 原因是,我有许多从这个基类派生的用户控件,子窗体可以有这些控件中任何一个的实例,而不管是哪个。唯一的要求是子窗体可以以相同的方式处理来自每种类型控件的相同事件 一些淡化的代码片段(不幸的是仍然很长): 简言之,这就是我如何让孩子形成的,以及一切都是如何运作的。但当我按下继承子控件中的按钮时,事件只会到达基类,而不会将RaiseEve

基本上,我有一个自定义的子窗体类,它包含将传递给父窗体的事件。在自定义子窗体中,我有一个“MustInherit”类的声明,该类继承了DevExpress用户控件类

原因是,我有许多从这个基类派生的用户控件,子窗体可以有这些控件中任何一个的实例,而不管是哪个。唯一的要求是子窗体可以以相同的方式处理来自每种类型控件的相同事件

一些淡化的代码片段(不幸的是仍然很长):

简言之,这就是我如何让孩子形成的,以及一切都是如何运作的。但当我按下继承子控件中的按钮时,事件只会到达基类,而不会将RaiseEvent遍历到假定要处理事件的子窗体中

我是不是在这里


谢谢你的阅读

您忘记使用AddHandler或Handles标识符添加事件句柄。请参见下面使用句柄cgChild.MoveToDocker标识符


公共类子表单
...
公共子cgChild_MoveToDocker(ByVal sender作为对象,ByVal e作为ChildControlInheritedClass.ChildGridMoveArgs)处理cgChild.MoveToDocker
RaiseEvent MoveToDocker(发件人,新的ChildControlInheritedClass.ChildGridMoveArgs(cgChild))
端接头

期末考试

哈,你说得对。我还注意到了另一个本不该回避的棘手问题。我我有两个按钮组成了相同的窗口,在它们的点击处理程序中有相同的代码(我正在试验)。最后,我编辑的代码甚至不是我用来打开窗口的按钮的代码。窗口没有正确创建,用户控件也没有“添加”到控件集合中。所以我在子窗口上点击的按钮,是我之前扔到那里的那个占位符。所以赞成。我觉得自己很笨。谢谢你的回复!
'''Inherited Class
Public Class ChildControlInheritedClass
    'A Button Click event that starts the chain of events.
    Private Sub btnMoveDocker_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConvertToTab.Click
        OnMoveToDocker(Me, New ChildGridMoveArgs(Me))
    End Sub
End Class

'''Base Class
Public MustInherit Class ChildControlBaseClass
    Inherits DevExpress.XtraEditors.XtraUserControl
    Public Class ChildGridMoveArgs
        Inherits System.EventArgs
        Public Sub New(ByVal _ChildControl As ChildControlInheritedClass)
            ChildControl = _ChildControl
        End Sub
        Public ChildControl As ChildControlInheritedClass
    End Class
    Public Event MoveToDocker(ByVal sender As Object, ByVal e As ChildGridMoveArgs)
    Protected Overridable Sub OnMoveToDocker(ByVal sender As Object, ByVal e As ChildGridMoveArgs)
        '''Once this RaiseEvent is fired, nothing happens. The child form is oblivious.
        RaiseEvent MoveToDocker(sender, e)
    End Sub
End Class

'''Child Form Class
Public Class ChildForm
    Private WithEvents cgChild As ChildControlBaseClass
    Public Property ChildGrid() As ChildControlInheritedClass
        Get
            Return cgChild
        End Get
        Set(ByVal value As ChildControlInheritedClass)
            RemoveHandler cgChild.MoveToDocker, AddressOf cgChild_MoveToDocker
            cgChild.Dispose()
            cgChild = Nothing
            cgChild = value
            AddHandler cgChild.MoveToDocker, AddressOf cgChild_MoveToDocker
        End Set
    End Property
    Public Event MoveToDocker(ByVal sender As Object, ByVal e As ChildControlInheritedClass.ChildGridMoveArgs)
    Public Sub cgChild_MoveToDocker(ByVal sender As Object, ByVal e As ChildControlInheritedClass.ChildGridMoveArgs)
        RaiseEvent MoveToDocker(sender, New ChildControlInheritedClass.ChildGridMoveArgs(cgChild))
    End Sub
End Class

Public Class frmMain
    Private Sub OpenNewWindow()
        Dim frm As New ChildForm
        Dim chld As New ChildControlInheritedClass
        frm.ChildGrid = chld
        frm.Show()
    End Sub
End Class

Public Class ChildForm
    ...
    Public Sub cgChild_MoveToDocker(ByVal sender As Object, ByVal e As ChildControlInheritedClass.ChildGridMoveArgs) Handles cgChild.MoveToDocker
        RaiseEvent MoveToDocker(sender, New ChildControlInheritedClass.ChildGridMoveArgs(cgChild))
    End Sub
End Class