Manejo de Eventos una clase abstracta
-
02-10-2019 - |
Pregunta
Básicamente, tengo una clase de formulario personalizado niño que tiene eventos que serán pasados ??a los padres. En el formulario personalizado niño, tengo una declaración de una clase "MustInherit" que hereda el usuario DevExpress clase de control.
La razón de esto, es que tengo muchos controles de usuario que se derivan de esta clase base, y el formulario secundario puede tener una instancia de cualquiera de estos controles, y la atención de los que duerma. El único requisito es que la forma niño puede contener los mismos eventos de cada tipo de control de la misma manera.
Algunos fragmentos de código aguadas (siendo bastante larga por desgracia):
'''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
En pocas palabras, eso es lo que hizo que el formulario secundario y cómo todo se supone que el trabajo. Pero cuando pulso el botón en el control secundario heredada, el evento sólo llega hasta la clase base y nunca atraviesa la RaiseEvent en el formulario secundario eso supone que debe controlar el evento.
¿Estoy aún en el estadio de béisbol aquí?
Gracias por leer!
Solución
Se le olvidó añadir su identificador de evento utilizando AddHandler o manijas identificador. Véase más abajo usando los mangos cgChild.MoveToDocker identificador.
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