[How to] Pasar datos de Form hijo a Form padre

Hoy en la mañana el amigo Julio Avellaneda me planteó la duda de cómo pasar información de un Form hijo (al estilo modal) a un Form principal (padre). Bien, pues esta es una duda recurrente, la comunicación entre Forms es algo que siempre es muy discutido y necesario en nuestras aplicaciones, en un post anterior vimos como pasar información entre dos WinForms, y faltó una técnica, que es sin duda una de las más pro.

Para comunicar un Form hijo con uno padre que ya está instanciado es necesario hacer uso de las interfaces, con el objetivo de que exista algo de “intermedio” que permita su comunicación “indirecta”.

Para el desarrollo de este ejemplo tendremos dos WinForms, siendo Form1 el Form padre y Form2 el Form hijo, en el Form1 agregaremos un TextBox y un Button, al Textbox le cambiaremos la propiedad ReadOnly a true (impedir su escritura). En el Form2 agregamos lo mismo un Button y TextBox. Por último agregamos una nueva interfaz que llamaremos IForm.

El uso de esta interfaz nos permitirá desacoplar la comunicación entre los dos WinForms, para esto creamos un miembro que reciba como parámetro el valor string que deseamos asignar, así:

public interface IForm
{
        void cambiarTexto(string text); 
}

Una vez construida la interfaz, vamos a utilizarla en nuestros Forms, en el Form1 (Form padre), implementamos la interfaz que hemos creado, así:

public partial class Form1 : Form, IForm
{
        public Form1()
        {
            InitializeComponent();
        }
        public void cambiarTexto(string text)
        {
            textBox1.Text = text;
        }
}

Ahora en el Form2 (Form hijo), en el evento del botón enviar texto declaramos un objeto de la interfaz y le asignamos el Form definido como hijo siendo este casteado al tipo de la interfaz, luego simplemente apuntamos al miembro y pasamos el valor, así:

private void button1_Click(object sender, EventArgs e)
{
            IForm miInterfaz = this.Owner as IForm;
            if (miInterfaz != null)
                miInterfaz.cambiarTexto(textBox1.Text);
            this.Dispose();
} 

De esta forma se comunican de form hijo a form padre, usando “algo de intermedio” que nos permita la comunicación desacoplada.

Descarga el ejemplo.

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
[How to] Pasar datos de Form hijo a Form padre

20 comentarios en “[How to] Pasar datos de Form hijo a Form padre

  1. John dijo:

    me pareece muy interesante tu ejemplo, lo que me gustaria saber es que si esta clase funciona como un variable temporla desde que se crea el form1 esperando ser llamda por cualquier otro
    gracias

  2. marisa dijo:

    El ejemplo es muy interesante pero me gustaria saber como puedo enviar datos entre dos formularios hijos que inicialmente ya esten abiertos en c#

    1. Hola,

      Si el tema de las interfaces es algo confuso de entrada… pero despues veras lo faciles que son y cuantos nos ayudan. Como tal tu no creas instancias de la interfaz, es decir, en estas DEFINES propiedades y/o miembros que seran implementadas en la clase que implemente de esta. y sera esta (la clase) quien le agregue la logica a estas propiedades/miembros.

      la mejor explicacion que eh visto en la Web de este tema la tiene el amigo Eduard Tomas, mira:
      http://geeks.ms/blogs/etomas/archive/2010/07/07/c-b-225-sico-interfaces.aspx

      Saludos.

  3. Cristian dijo:

    Muy bueno el ejemplo, estaba buscando por todos lados como hacer eso, pero te falto mencionar algo

    y es que al momento de llamar al hijo debemos poner esto:

    private void button1_Click(object sender, EventArgs e)
    {
    Form2 hijo = new Form2();
    hijo.showDialog(this);
    }

    Cuando lo hice no me funcionaba hasta que lo descargue y vi que no habia hecho esto.

    Muchas Gracias por enseñar esto.

      1. Hola @Nach.

        Que problemas tienes para descargar el ejemplo?… esta en mi Skydrive en el enlace que he dejado en el articulo. (Das clic derecho -> descargar.)

        Cualquier inquietud no dudes en comunicarmela.

        Saludos.

  4. PAcho dijo:

    Buenas Noches:
    Muy buen su ejemplo. quisiera saber como hago para pasar informacion pues creo que de hijo a hijo. porque tengo un proyecto en C# donde tengo un formulario principal que tiene un menu desde el menu llamo a un form1 y desde el form1 llamo a un form2 que es que tiene la informacion y la quiero pasar al form1 no he podido. si alguien sabe le agradeceria la informacion.

    aplique el ejemplo que tienes aqui y no he podido ya que en el evento this.owner obtengo es el formulario principal y no el frm1 que es donde necesito que me agrege la informacion. gracias.

    1. Hola @Pacho.

      Pero no entiendo bien tu pregunta, porque si desde el form1 llamas al form2 quiere decir que puedes aplicar perfectamente lo mostrado en este ejemplo, no? Osea, desde el form1 cuando hagas form2.Show(this) //indicas que elpropietario será el form actual, y puedes seguir normalmente.

      Cualquier inquietud no dudes en comentar.

      Saludos.

    1. Hola.

      has evaluado la posibilidad de emplear entidades? y una implementación de MVVM iría perfecto, o haciendo uso de un patrón singleton para poder hacer que ambos formularios trabajen al tiempo con la misma instancia de tu entidad.

      Saludos.

  5. Holaa como andas, ante todo gracias por la ayuda, pero me surgió un problema raro… a que se puede deber que

    IForm miInterfaz = this.Owner as IForm;

    me devuelva null? probé con muchas cosas pero nada funciona, en el ejemplo funciona y en mi proyecto no :s, y tengo todo igual.. tendré que agregar alguna sentencia explicita o algo para que funcione en mi proyecto? gracias!

    1. dezconozco la razon la razon, pero reemplace

      private void button1_Click(object sender, EventArgs e)
      {
      Form2 hijo = new Form2();
      hijo.showDialog();
      }

      por

      private void button1_Click(object sender, EventArgs e)
      {
      Form2 hijo = new Form2();
      hijo.showDialog(this);
      }

      y funciono!

      1. Walter dijo:

        Gracias loco, me salvaste, no sabía que hacer, iba a tirar todo por la ventana, pero le agregue el “me” (si, uso vb.net jaja) y funciono espectacular!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s