Vb winform personalizado evento handler

Estoy tratando de añadir manejador de eventos personalizado en el control de usuario.

Si creo el control de usuario en la misma solución y en el mismo proyecto, puedo añadir el manipulador de eventos personalizado en el formulario principal.

AddHandler usercontrol1.button.click, addressof button_clickHandler

cuando escriba en el control de usuario1. Puedo seleccionar el botón desde la terminación del código pop-up

pero si creo otro proyecto para el control del usuario en la misma solución, diga el control del usuario llamado uc así que después de ponerlo en la forma principal con nombre uc1

AddHandler uc1.button.click...

cuando escriba en uc1. No puedo ver el botón en la finalización del código pop-up y cuando lo compré si me escribe AddHandler uc1.button.click, dirección del botón_clickHandler2

Me compilan error uc1.button no es accesible en este contexto porque es amigo.

¿El evento personalizado de control de usuario solo funciona si el control de usuario creado en el mismo proyecto?

Estoy pensando sólo para separar el control de usuario común y otra biblioteca común, en un proyecto, para que pueda consumir por otro proyecto, en lugar de crear el mismo control de usuario en cada proyecto.

Aprecié si pudieras dar algún puntero sobre cómo crear gestor de eventos personalizados o simplemente tengo que crear control de usuario en el mismo proyecto para que funcione.

Gracias.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por cybermage


3 Respuestas:

  • Mientras que la solución simple es declarar el control de los niños Public en lugar del predeterminado Friend, la buena práctica sería no exponer los controles infantiles de un control de usuario de todos modos, no importa donde se declare. Deben hacerse controles de los niños Private y debe proporcionar avances para cualquier propiedad, métodos o eventos que desee acceder desde el exterior. Por ejemplo, declara tu propio ButtonClick evento en el control del usuario, manejar el Click evento del Button internamente y luego levantar su propio evento, por ejemplo.

    Public Event ButtonClick As EventHandler
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        OnButtonClick(EventArgs.Empty)
    End Sub
    
    Protected Overridable Sub OnButtonClick(e As EventArgs)
        RaiseEvent ButtonClick(Me, e)
    End Sub
    

    Su formulario se encargará de los eventos del control del usuario y no de sus controles infantiles. See Aquí. para más información acerca de declarar y criar sus propios eventos.

    BTW, una razón para no controlar a los niños Public es que entonces cualquier código que tenga acceso al control del usuario tiene acceso a TODO el aspecto de los controles del niño, incluyendo poder reemplazarlos con nuevos controles. Haciéndolos Private y facilitando avances, expones sólo los aspectos específicos de los controles infantiles que deben ser accesibles desde el exterior. También significa que su control de usuario se comporta más como unidad integrada, en lugar de una colección de piezas. En la materia de eventos específicamente, también significa que el control del usuario es el sender en cada controlador de eventos, en lugar del control individual de los niños.

    Respondida el Dec 17, 2020 a las 23:26 - por binarybuilder

    Votos positivos: 0 | Votos negativos: 0

  • Para poder utilizar un evento personalizado en un control de usuario que se encuentra en otro proyecto dentro de la misma solución, debes asegurarte de que el evento sea público y accesible desde el proyecto principal.

    Aquí te dejo los pasos que puedes seguir:

    • Asegúrate de que el evento personalizado en tu control de usuario esté declarado como público.
    vb
    Public Event ButtonClick As EventHandler
    
    • En tu control de usuario, agrega un método que dispare el evento cuando el botón sea clickeado.
    vb
    Private Sub Button_Click(sender As Object, e As EventArgs) Handles button.Click
        RaiseEvent ButtonClick(sender, e)
    End Sub
    
    • En el formulario principal donde estás utilizando el control de usuario desde otro proyecto, puedes conectar el evento personalizado de la siguiente manera:
    vb
    AddHandler uc1.ButtonClick, AddressOf Button_ClickHandler2
    

    Con estos pasos, deberías poder utilizar un evento personalizado en tu control de usuario desde otro proyecto en la misma solución. Asegúrate de que el control de usuario esté correctamente referenciado en el proyecto principal para que puedas acceder a sus eventos públicos.

    Respondida el Dec 18, 2020 a las 23:26 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Solución:

    Para utilizar eventos personalizados de controles de usuario en proyectos separados, debes marcar el evento como Public en la definición del control de usuario.

    Pasos:

    • Abre el archivo de código del control de usuario.
    • Declara el evento personalizado como `Public`. Por ejemplo:
    vb
    Public Event ButtonClicked As EventHandler
    
    • Agrega el siguiente código al manejador de eventos del botón en el control de usuario:
    vb
    RaiseEvent ButtonClicked(sender, e)
    
    • En el formulario principal, agrega el siguiente código para suscribirte al evento:
    vb
    AddHandler uc1.ButtonClicked, AddressOf ButtonClickedHandler
    

    Ejemplo:

    vb
    ' En el control de usuario:
    Public Event ButtonClicked As EventHandler
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        RaiseEvent ButtonClicked(sender, e)
    End Sub
    
    ' En el formulario principal:
    Protected Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler uc1.ButtonClicked, AddressOf ButtonClickedHandler
    End Sub
    
    Private Sub ButtonClickedHandler(sender As Object, e As EventArgs)
        MessageBox.Show("El botón del control de usuario se hizo clic")
    End Sub
    

    Nota:

    Asegúrate de que el control de usuario esté correctamente referenciado en el proyecto del formulario principal.

    Respondida el Dec 18, 2020 a las 23:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0