none
Enviar instrucciones de un formulario a otro RRS feed

  • Pregunta

  • Buenas gente, qué tal. Hace tiempo que hice una pregunta con este problema que vengo sosteniendo y qué no sé como resolver. La verdad, yo pienso que es muy fácil resolverlo pero no encuentro solución. El asunto es el siguiente.

    Tengo 2 formularios. (frmGeneratorEvents, frmNewEvent).

    En el primer formulario, tengo un botón (btnNewEvent) del cual me abre el formulario 2 (frmNewEvent).

    Dentro del formulario frmNewEvent, tengo un boton del cual, al presionarlo, haga que el boton (btnNewEvent) se bloquee o se haga invisible. Da igual, yo quiero cambiar su comportamiento a través de otro formulario. Para esto emplee este código:

    Dentro del Formulario 2 (frmNewEvent):

      public void btnSendEvent_Click(object sender, EventArgs e)
            {
                frmGeneratorEvents f1 = new frmGeneratorEvents();
                f1.btnNewEvent.Enabled = true;
            }

    Básicamente, ya con esto debería hacer visible el boton que se encuentra en el formulario 1. No me da errores ni nada, simplemente no pasa nada. 

    Alguna ayuda?


    sábado, 9 de diciembre de 2017 2:51

Respuestas

  • // frmGeneratorEvents.cs
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication404
    {
        public partial class frmGeneratorEvents : Form
        {
            public frmGeneratorEvents()
            {
                InitializeComponent();
            }
    
            private void btnNewEvent_Click(object sender, EventArgs e)
            {
                frmNewEvent f = new frmNewEvent();
                f.Acción += F_Acción;
                f.Show();
            }
    
            private void F_Acción()
            {
                btnNewEvent.Enabled = false;
            }
        }
    }
    
    // frmNewEvent.cs
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication404
    {
        public partial class frmNewEvent : Form
        {
            public event Action Acción;
    
            public frmNewEvent()
            {
                InitializeComponent();
            }
    
            private void btnSendEvent_Click(object sender, EventArgs e)
            {
                if (Acción != null) Acción();
            }
        }
    }
    

    sábado, 9 de diciembre de 2017 3:57

Todas las respuestas

  • // frmGeneratorEvents.cs
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication404
    {
        public partial class frmGeneratorEvents : Form
        {
            public frmGeneratorEvents()
            {
                InitializeComponent();
            }
    
            private void btnNewEvent_Click(object sender, EventArgs e)
            {
                frmNewEvent f = new frmNewEvent();
                f.Acción += F_Acción;
                f.Show();
            }
    
            private void F_Acción()
            {
                btnNewEvent.Enabled = false;
            }
        }
    }
    
    // frmNewEvent.cs
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication404
    {
        public partial class frmNewEvent : Form
        {
            public event Action Acción;
    
            public frmNewEvent()
            {
                InitializeComponent();
            }
    
            private void btnSendEvent_Click(object sender, EventArgs e)
            {
                if (Acción != null) Acción();
            }
        }
    }
    

    sábado, 9 de diciembre de 2017 3:57
  • Muchas gracias por la respuesta! La verdad es muy simple y me sirvió para lo que quiero hacer. Si no es mucha molestia, me explicarías un poco la lógica del código?

    En el botón (btnNewEvent) entiendo que sucede lo siguiente:

    private void btnNewEvent_Click(object sender, EventArgs e) {

    //Se instancia el segundo formulario frmNewEvent f = new frmNewEvent();

    //Llama al metodo que creamos? f.Acción += F_Acción; f.Show(); }

    Acá por lo que entiendo, se le pregunta al Evento Acción si es distinto de nulo o vacío y de ser así se ejecuta.

           private void btnSendEvent_Click(object sender, EventArgs e)
            {
                if (Acción != null) Acción();
            }

    domingo, 10 de diciembre de 2017 0:31
  • El formulario de la clase frmNewEvent, publica un evento de tipo Action llamado Acción. Este formulario le comunica al mundo, que quien desee saber cuando se oprime su botón btnSendEvent, se suscriba a ese evento.

    En el método btnSendEvent_Click, se determina si el evento Acción fue suscripto por alguien. Si es así entonces se invoca Acción(), que tiene la apariencia de un functor de c++, pero no. Acción es un objeto de tipo Delegate, que mantiene una lista de funciones del tipo Action (funciones que no toman argumentos ni devuelven un valor). Las funciones en esa lista son invocadas cuando se invoca Acción().

    Mientras, el formulario de la clase frmGeneratorsEvents, instancia un form de la clase frmNewEvent y se suscribe a su evento Accion, proporcionando un delegado del tipo solicitado y encarnado en su método void F_Acción(). 

    Fijate que el formulario de la clase frmNewEvent no conoce, ni le importa, lo que ocurre en F_Acción.

    Fijate que si el botón btnSendEvent, hubiese sido public, el form de la clase frmGeneratorsEvent hubiese podido suscribirse a su evento Click de forma directa.


    domingo, 10 de diciembre de 2017 1:12
  • Buenisimo! Me quedó un poco más claro :D
    domingo, 10 de diciembre de 2017 22:45