domingo, 30 de septiembre de 2012

Usando delegados para intercambiar informacion entre ChildForms de un Parent Form en C#.NET

A menudo en aplicaciones MDI, necesitamos intercambiar informacion entre Child Forms que son instanciados por el mismo Parent Form. En tales casos, los delegados son un modo adecuado para intercambiar como.
En este programa tendremos un Form Padre y 2 Child Forms. Los forms hijos seran instanciados por el padre. El segundo form hijo va a interactuar con el primero a traves del Parent Form usando delegados. En este ejemplo mostraremos como usar delegados para realizar esta interaccion. Puedes utilizar las mismas tacticas para desarrollar otros tipos similares de procedimientos.
Lo que sea que el usuario escriba en el textbox del segundo formulario y luego de click en el boton Submit, ese texto sera mostrado en el label del primer formulario. Esta interaccion entre forms hijos es monitoreada y manejada por el form padre.
Para esto en el Form Padre colocamos 2 botones como la figura de arriba y cuando pulsemos el primer boton, instanciamos el primer form y el Parent Form creara un puntero a una funcion del formulario.
private void btnFirst_Click(object sender, EventArgs e)
        {
            frmFirstChild FrmFirst = new frmFirstChild();
            FrmFirst.MdiParent = this;
            FrmFirst.Show();
            FrmFirst.Activate();
            SayHello = FrmFirst.FuncDisplayMsg;
        }
Esto quiere decir, que el delegado SayHello del Parent Form mantiene un puntero al metodo del primer formulario. La declaracion del primer formulario es asi:
private delegate void DelSayHello(string Msg);
        private DelSayHello SayHello;
Y el metodo que sera llamado es(este metodo estara dentro del Primer Form):
public void FuncDisplayMsg(string Msg)
        {
            this.lblMsg.Text = Msg;
        }
Ahora el Form padre llamara a este metodo del primer Form Child cuando un metodo del segundo Child Form pase un valor al padre. Para hacer esto, el Parent Form tiene un metodo que sera llamado del segundo Child Form(via delegados). El metodo es:
private void InvokeFunc(string Msg)
        {
            if (SayHello != null)
                SayHello.Invoke(Msg);
        }
Ahora que pasara cuando el segundo Child Form sea instanciado?. El segundo Child Form tiene un delegado que tiene un puntero del metodo mencionado arriba. El codigo del evento click sera asi:
private void btnSecond_Click(object sender, EventArgs e)
        {
            frmSecondChild FrmSecond = new frmSecondChild();
            FrmSecond.MdiParent = this;
            FrmSecond.InvokeDel = this.InvokeFunc;
            FrmSecond.Show();
            FrmSecond.Activate();
        }
Y finalmente, cuando el usuario clickee en el boton Submit del segundo Child Form, el texto del textbox es pasado al Parent Form, el cual a cambio pasa el valor al primer Child Form y el texto es mostrado. Este sera el codigo del segundo Form:
public delegate void DelInvoke(string Msg);
        public DelInvoke InvokeDel;

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            if (this.InvokeDel != null)
                InvokeDel.Invoke(this.txtMsg.Text);
        }

0 comentarios:

Publicar un comentario