none
Ocultar Boton de UserControl A presionando Boton de UserControl B C# RRS feed

  • Pregunta

  • Hola,

     Necesito ocultar un boton que se encuentra en el USerControl A, presionando un boton desde mi USerControl B, los dos USControl se encuentras en un Form, favor su ayuda, muchas gracias.

    UserControl A

    namespace ControlPalada
    {
    
        public partial class ucIngresoClicloPaladas : UserControl
        {
            Connection conn = new Connection();
            Connection write = new Connection();
    
            public ucIngresoClicloPaladas()
            {
                InitializeComponent();
                
            }
    
            public void _showBtn()
            {
                btnTolvaFinal1.Visible = false;
            }
    

    UserControl B

    namespace ControlPalada
    {
        public partial class usTolvas : UserControl
        {
    
    
            public usTolvas()
            {
                InitializeComponent();
                
            }
    
            private void btnTolva1_Click(object sender, EventArgs e)
            {
                ucIngresoClicloPaladas showBtn = new ucIngresoClicloPaladas();
                showBtn._showBtn();
                btnTolva1.BackColor = Color.Green;
            }
    


    jueves, 13 de diciembre de 2018 15:07

Respuestas

  • Una mala idea seria que el usercontrol B tenga una referencia al A, porque eso los vincula fuertemente y luego ya no se pueden reutilizar por separado.

    Una solucion elegante es publicar un evento en el usercontrol B y disparar ese evento cuando se pulse el control. En el userControl A se publica una propiedad que sea la visibilidad del boton que quieres ocultar. Y desde el Form que contiene ambos usercontrols enlazas las dos cosas: conectas un manejador al evento del usercontrol B y dentro del manejador cambias la propiedad que ublicaste en el usercontrol A.

    EDITADO: Ejemplo:

    // En el Usercontrol B:
    
    public event EventHandler BotonPulsado;
    
    private void Button1_Click(object sender, EventArgs e) //Obviamente, esto hay que conectarlo con el click del botón desde el diseñador
    {
        if (BotonPulsado!=null) BotonPulsado(this, EventArgs.Empty);
    }
    
    // En el UserControl A:
    
    public bool BotonVisible { get { return button1.Visible; } set { button1.Visible=value; } }
    
    // En el formulario:
    
    public void UserControlA1_BotonPulsado(object sender, EventArgs e) // Obviamente, conectarlo desde el diseñador con el evento correspondiente
    {
        UserControlB1.BotonVisible = false;
    }

    jueves, 13 de diciembre de 2018 17:30
    Moderador

Todas las respuestas

  • Una mala idea seria que el usercontrol B tenga una referencia al A, porque eso los vincula fuertemente y luego ya no se pueden reutilizar por separado.

    Una solucion elegante es publicar un evento en el usercontrol B y disparar ese evento cuando se pulse el control. En el userControl A se publica una propiedad que sea la visibilidad del boton que quieres ocultar. Y desde el Form que contiene ambos usercontrols enlazas las dos cosas: conectas un manejador al evento del usercontrol B y dentro del manejador cambias la propiedad que ublicaste en el usercontrol A.

    EDITADO: Ejemplo:

    // En el Usercontrol B:
    
    public event EventHandler BotonPulsado;
    
    private void Button1_Click(object sender, EventArgs e) //Obviamente, esto hay que conectarlo con el click del botón desde el diseñador
    {
        if (BotonPulsado!=null) BotonPulsado(this, EventArgs.Empty);
    }
    
    // En el UserControl A:
    
    public bool BotonVisible { get { return button1.Visible; } set { button1.Visible=value; } }
    
    // En el formulario:
    
    public void UserControlA1_BotonPulsado(object sender, EventArgs e) // Obviamente, conectarlo desde el diseñador con el evento correspondiente
    {
        UserControlB1.BotonVisible = false;
    }

    jueves, 13 de diciembre de 2018 17:30
    Moderador
  • Hola Alberto,

     Gracias por tu tiempo, Edite mi codigo llevandolo a tu logica pero tengo problemas en el form1.

    //USControl A
    
    namespace ControlPalada
    {
    
        public partial class ucIngresoClicloPaladas : UserControl
        {
            Connection conn = new Connection();
            Connection write = new Connection();
    
            public ucIngresoClicloPaladas()
            {
                InitializeComponent();
                
            }
            
            public bool BotonVisible
            {
                get
                {
                    return btnTolvaFinal1.Visible;
                }
                set
                {
                    btnTolvaFinal1.Visible = value;
                }
            }
    
    //USControl B
    
    namespace ControlPalada
    {
        public partial class usTolvas : UserControl
        {
    
            public usTolvas()
            {
                InitializeComponent();
                
            }
            public event EventHandler BotonPulsado;
            
            private void btnTolva1_Click(object sender, EventArgs e)
            {
                if (BotonPulsado != null) BotonPulsado(this, EventArgs.Empty);
                
                btnTolva1.BackColor = Color.Green;
            }
    
    //FORM1
    
    namespace ControlPalada
    {
        public partial class Form1 : Form
        {
    
            public void ucIngresoCicloPaladas_BotonPulsado(object sender, EventArgs e)
            {
                usTolvas showBtn = new usTolvas();
    
                //DA ERROR
                showBtn.BotonPulsado = true;
                showBtn.Show();
    
            }
    



    jueves, 13 de diciembre de 2018 19:47
  • //NO SE, SI ESTA CORRECTO

    private void btnTolva1_Click(object sender, EventArgs e)

    //...

    Form1 formulario = new Form1();

    No, no solo no está correcto sino que de hecho es doblemente erróneo.

    En primer lugar, no funcionará. Al hacer "new Form1()" creas una nueva copia del formulario, que queda oculta y no se ve en pantalla porque no le haces un "Show". Todo lo que hagas con esa copia, como por ejemplo los controles que le estás añadiendo, se hace sobre la instancia oculta y no sobre la instancia que está en la pantalla, por lo que no sirve para nada.

    Y en segundo lugar, rompe la encapsulación y jerarquía de datos, ya que haces que el UserControl tenga que conocer el formulario que lo contiene (al referenciar Form1 dentro del UserControl). Eso te impide reutilizar el usercontrol dentro de cualquier otro formulario.

    Conclusión: Es un muy mal diseño. Desde dentro de un UserControl no deberías hacer nada sobre el formulario que lo contiene. En su lugar, el usercontrol debe publicar la información que requiera el formulario (usando propiedades públicas, como la que te mostré en mi ejemplo para el formulario A), y disparar eventos cuando desee que el formulario cambie algo (como te mostré en el ejemplo del usercontrol B) y entonces el formulario hace los cambios mediante un manejador para ese evento (como en el ejemplo que te puse antes).

    jueves, 13 de diciembre de 2018 20:20
    Moderador
  • Gracias por tu respuesta, edite el codigo pero no logo compilar el Form1.

    //USControl A
    
    namespace ControlPalada
    {
    
        public partial class ucIngresoClicloPaladas : UserControl
        {
            Connection conn = new Connection();
            Connection write = new Connection();
    
            public ucIngresoClicloPaladas()
            {
                InitializeComponent();
                
            }
            
            public bool BotonVisible
            {
                get
                {
                    return btnTolvaFinal1.Visible;
                }
                set
                {
                    btnTolvaFinal1.Visible = value;
                }
            }
    
    //USControl B
    
    namespace ControlPalada
    {
        public partial class usTolvas : UserControl
        {
    
            public usTolvas()
            {
                InitializeComponent();
                
            }
            public event EventHandler BotonPulsado;
            
            private void btnTolva1_Click(object sender, EventArgs e)
            {
                if (BotonPulsado != null) BotonPulsado(this, EventArgs.Empty);
                
                btnTolva1.BackColor = Color.Green;
            }
    
    //FORM1
    
    namespace ControlPalada
    {
        public partial class Form1 : Form
        {
    
            public void ucIngresoCicloPaladas_BotonPulsado(object sender, EventArgs e)
            {
                //DA ERROR
                showBtn.BotonPulsado = true;
                showBtn.Show();
    
            }



    jueves, 13 de diciembre de 2018 20:24
  • //DA ERROR

    showBtn.BotonPulsado = true;

    Seguramente el error es porque showBtn no está definido en el sitio en el que lo estás llamando. ¿Qué se supone que es showBtn, y dónde está definido?

    Si no es ese el problema, copia en el foro el mensaje de error completo, exacto y detallado. De hecho, es en general una buena práctica hacerlo así: acostúmbrate a no decir nunca en los foros "me da error". Siempre hay que explicar cuál es el error, transcribiendo el mensaje exacto, completo y detallado, indicando con toda precisión la línea en la que se produce. Así los participantes del foro, que no ven tu equipo, pueden dar una respuesta razonablemente bien enfocada al problema que se produce.

    jueves, 13 de diciembre de 2018 21:16
    Moderador
  • Alberto,

     Gracias por tus consejos, es mi primera publicacion, como te dije no llevo mucho en programacion.

    No logo hacer lo que explicas en tu ejemplo:

    // En el formulario:
    
    public void UserControlA1_BotonPulsado(object sender, EventArgs e) // Obviamente, conectarlo desde el diseñador con el evento correspondiente
    {
        UserControlB1.BotonVisible = false;
    }
    
    

    Form1:


    viernes, 14 de diciembre de 2018 12:48
  • Estás mezclando la propiedad con el evento. En mi ejemplo, "BotonPulsado" era el evento. No le puedes poner "true" a un evento, eso hay que ponérselo a la propiedad, que es la que yo llamé "BotonVisible".

    Fíjate que hay una contradicción en tu "post". En el código que has pegado dice BotonVisible=false. Pero en la imagen capturada del fuente pone BotonPulsado=false. El correcto es Visible, no Pulsado, suponiendo que Pulsado es el evento y Visible es la propiedad, como you puse en mi ejemplo.

    viernes, 14 de diciembre de 2018 14:14
    Moderador
  • Estoy haciendo pruebas, deje el boton del usControl A inicializado en false y cuando presiono el boton del usControl B le cambia la visivilidad = true.

    En el Form1 no puedo llamar el evento botonVisible.

    usControl A

    usControl B

    Form1

    viernes, 14 de diciembre de 2018 14:55
  • En el Form1 no puedo llamar el evento botonVisible.

    No, claro que no puedes, los eventos no se pueden llamar, Solo puedes llamar a las propiedades. BotonVisible no tiene que ser un evento sino una propiedad.

    Afortunadamente, se trata efectivamente de una propiedad y no un evento.

    Desafortunadamente, lo estas invocando sobre el objeto equivocado. F'ijate en la captura de pantalla: cuando tecleas uTovvas1.boto te ofrece BotonPulsado. Y BotonPulsado esta definido dentro de usTolvas. Por lo tanto, no estas llamando al userControl1, que es donde tienes definido BotonVisible.

    Segun la pregunta original, querias que al pulsar un boton en el UserControlB se ocultase otro boton en el UserControlA. Segun el codigo que has escrito, al pulsar un boton en el UserControlB intentas ocultar un boton en el UserControlB (no en el A). Y claro, no te deja porque en el B no tenemos la propiedad que oculta el boton, solo la tenemos en el A.

    viernes, 14 de diciembre de 2018 17:10
    Moderador
  • Hice el codigo de la forma que tu me indicaste en el ejemplo, gracias de todas formas por tu ayda .!

    viernes, 14 de diciembre de 2018 17:22