none
clases. Acceder a evento de nivel de clase superior RRS feed

  • Pregunta

  • Como puedo acceder a un procedimiento de nivel superior.

    Ejemplo

    public class cPrincipal
     sub new
    
     end sub
    
     public event Mensaje (msg as string)
    
     public class secundaria
      ...
      RaiseEvent Mensaje("Recuperando datos...")
      ... 
     end class
    end class

    Este código da error en el código fuente diciendo que Mensaje no es un evento de .. en mi ejemplo class secundaria, lo cual es cierto pero no pude accede al evento de nivel inferior ni poniendo cprincipal.mensaje...

    desde el código dentro de la clase Secundaria deseo hacer el raiseevent que esta dentro de principal.

    ¿Como puedo hacerlo?


    Hugo A. Gsell



    • Editado hagsell martes, 28 de junio de 2016 15:34
    martes, 28 de junio de 2016 12:47

Respuestas

  • "hagsell" preguntó:

    > Ejemplo
    >
    > public class cPrincipal
    >   sub new
    >
    > end sub
    >
    > public event Mensaje (msg as string)
    >
    > public class secundaria
    >  ...
    >  RaiseEvent Mensaje("Recuperando datos...")
    >  ...
    > end class
    > end class
    >
    > desde el código dentro de la clase Secundaria deseo hacer
    > el raiseevent que esta dentro de principal.
    >
    > ¿Como puedo hacerlo?

    Hola:

    Con el ejemplo de clases que has indicado, que yo sepa solamente podrás desencadenar el evento Mensaje desde algún procedimiento existente en la propia clase CPrincipal, ya que "no se puede utilizar RaiseEvent para generar eventos que no estén explícitamente declarados en la clase", aunque dicha instrucción se encuentre en una clase anidada a la clase cPrincipal (Public Class secundaria), tal y como así se indica en la ayuda de la instrucción  RaiseEvent a la que te remito para su lectura.

    Para poder desencadenar el evento Mensaje desde algún procedimiento de la clase Secundaria, tendrías que declarar el propio evento como compartido (Shared), tal y como muestra el siguiente ejemplo:

    Public Class CPrincipal
    
        Public Sub New()
    
        End Sub
    
        ' Declaramos el evento compartido.
        '
        Public Shared Event Mensaje(msg As String)
    
        Private Sub OnMensaje(msg As String)
            ' Desencadenamos el evento Mensaje desde
            ' la propia clase CPrincipal.
            RaiseEvent Mensaje(msg)
        End Sub
    
        Public Class Secundaria
    
            Public Sub OnMensaje(msg As String)
                ' Desencadenamos el evento Mensaje desde
                ' la propia clase Secundaria.
                RaiseEvent Mensaje(msg)
            End Sub
    
        End Class
    
    End Class

    Y para que observes que funciona, inserta en un formulario cualquiera de tu proyecto que tenga un control Button el siguiente código:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Añadimos el controlador para el evento
            ' Mensaje de la clase CPrincipal.
            AddHandler CPrincipal.Mensaje, AddressOf MensajeRecibido
    
            ' Creamos una nueva instancia de la clase secundaria
            Dim cs As New CPrincipal.Secundaria()
    
            ' Provocamos que se desencadene el evento Message
            ' llamando al método OnMesaje de la clase secuendaria.
            cs.OnMensaje("¡Hola, Mundo!")
    
            ' Eliminamos el controlador para el evento anterior,
            ' para que no se desencadenen 20 eventos si hacemos
            ' 20 veces clic sobre el control Button1.
            RemoveHandler cPrincipal.Mensaje, AddressOf MensajeRecibido
    
        End Sub
    
        Public Sub MensajeRecibido(msg As String)
    
            ' Mostramos el mensaje recibido
            MessageBox.Show(msg)
    
        End Sub

    Observa que es en el procedimiento MensajeRecibido existente en el formulario donde obtendrás el mensaje desencadenado por el evento Mensaje declarado como compartido (Shared) en la clase CPrincipal.

    Salvo que haya algo por ahí que yo ignore, es la única manera que conozco para que puedas desencadenar un evento de una clase concreta (la clase CPrincipal) desde otra clase anidada en ella (la clase Secundaria).

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    martes, 28 de junio de 2016 15:43
    Moderador