Pasando variables entre formularios Windows Forms

Esta es una pregunta que siempre esta latente, como pasamos variables entre formularios Windows Forms?, ya lo había respondido en un post en mi blog cuando estaba en golem Projects, a pedido del público la vuelvo a publicar, tal cual y como estaba en un origen, la saque de la cache de internet:

——————–

Hola a todos!

Siempre he recibido preguntas sobre como paso una var a otro form, como la recupero como la cambio, y todo lo que se puedan imaginar!

Primero debemos tener dos formularios:

  1. frmEmisor (formulario inicial este llama al otro formulario)
  2. frmReceptor (este formulario se muestra gracias a una accion del formulario emisor)

Ahora vamos viendo los casos: Quiero enviar un variable del formulario Emisor al Receptor.

  1. Debemos modificar el constructor del frmReceptor
    public frmReceptor ( string Nick) {
          //inicializar componentes….
          ………
          this.Nick = Nick;    //almacenar o lo que queramos hacer con la variable
    }
  2. Pues bien ya tenemos moficiado el constructor ahora vamos a ver como lo llamamos del frmEmisor:
    public btnLlamar_Click (….) {
         frmReceptor frm = new frmReceptor(txtNick.Text);
        
         frm.Show();   // también podemos llamarlo usando ShowDialog();
    }

Eso es todo ya le pasamos una variable del frmEmisor al Receptor . Ahora vamos a recuperar una variable del frmReceptor y usarla en el frmEmisor, manos al codigo 

  1. Recalcar que para poder hacer esto el segundo tiene que ser un formulario de Dialogo de lo contrario no se podrá recuperar la variable.. porque?… bueno porque no creo que seas tan rápdido en el teclado como tu procesador  (ver nota1 abajo). Lo primero es crear un variable pública (esta tendra el contenido de lo que queramos enviar del frmReceptor) en nuestro frmReceptor, porque pública?, para que lo pueda usar el frmEmisor, de lo contrario no lo podra usar
    //variable publica a nivel del frmReceptor
    public PuertoSerial ptoCOM;   //PuertoSerial es una clase que cree 😀
  2. Ahora tengo mi variable y se supone que alguna parte del frmReceptor le asigno algun contenido, eso queda a su criterio y de acuerdo a sus necesidades
  3. El punto crucial como le paso la varaible?. A mi parecer en este punto se quedan muchas personas ya que no saben como enviar la variable al frmEmisor, y porque creen?, pues porque desde frmReceptor no podemos ver ni accesar al frmEmisor..auque pensandolo bien si se puede si pasamos por referencia el frmEmisor…. pero ahi nos complicamos mas la vida.. vamos hacer algo simple…NO VAMOS A ENVIARLE NADA . Bueno lo que haremos es usar la variable recuperada y asignarle el valor, y dejaremos que esta variable sea accesa desde el otro form, entonces por eso no hay necesidad de enviarle nada. Solo tenemos que agregar dos botones a nuestro frmReceptor y decirle que serán los DialogResult.OK y DialogResult.Cancel, respectivamente. De tal manera que en cualquier boton regrese el control al frmEmisor y entonces pueda usar la variable.
  4. Punto final a usar la variable como mejor la necesitemos, atención al codigo es mas sencillo de lo que se pensaba: (ahora agregaremos algunos lineas a nuestro codigo anterior). Recuerden que esto es desde el frmEmisor:
    public btnLlamar_Click (….) {
         frmReceptor frm = new frmReceptor(txtNick.Text);
        
         DialogResult resp = frm.ShowDialog();   // también podemos llamarlo usando ShowDialog();

         if ( resp = DialogResult.OK) {    //si acepto en el formulario anterior

              //recuperando nuestra variable publica del frmReceptor
              this.PuertoCOM = frm.ptoCOM;        //ya ta , ahora puedo usar lo que asigne en el otro form
         }
    }

Pues bueno asi es como se comunican las formularios, bueno la forma que yo conosco, creo que es la más simple y practica. El problema muchas veces es que nosotros queremos hacer todo estrictamente, es decir por ejemplo, que queremos pasar a la mala una varaible del frmReceptor al frmEmisor, sin saber que tambien podemos un artificio para pasarle una variable sin que se de cuenta de que le pase .

Espero que este pequeño resumen le sea muy util!. Si no quedo claro me dejan su comentario! Fácil que mas adelanta publico un artículo con mas detalles y mas conceptos! Sería algo como Comunicación de Objetos en .NET, en Windows, Web, etc. Si hay la necesidad de un artículo mas detallado me lo hacen saber.

Saludos,

Nota1: Si llamas a un form.Show(), no espera que el formulario se cierre para seguir con la ejecución de las siguientes lineas de codigo, en nuestro caso se colgaria porque intentaria asignar al puerto el objeto que aun no existe, es por eso que tiene que ser ShowDialog, de tal manera que continue con su código una vez que el frmReceptor fue cerrado.

——————– 

Saludos, nuevamente :d

Post cruzado desde starrillo blog

24 comentarios en “Pasando variables entre formularios Windows Forms”

  1. Excelente, muchisimas gracias por compartir este tema, en mi caso es cosa cotidiana, y me ahorraste mucho timepo, de nuevo gracias!…

  2. Oye mano, no manches, gracias, si me hiciste el paro con este truco, la verdad ni idea.

    Oye, pero que tal crees que sea tan “ortodoxo” este procedimiento, porque la verdad buscando por la web me tope con maneras “oficiales” de hacerlo pero tenias que hacer uso de interfaces de clases y no se que desmadre mas…

    Saludos

  3. Así se abren formularios en c#

    Form frm = new FORM1(); //Donde pone FORM1 ponemos el formulario que queremos abrir
    frm.Owner = FORM.ActiveForm;//Formulario activo en el cual estamos sustituir tambien
    frm.ShowDialog();

  4. @Francisco Chacón, de nada.

    @Obi-One, pues depende del tamaño de la aplicación y complejidad de la misma, pero si este te funciona no hay problema. Las interfaces serían para escenarios recurrentes. Tienes el link?

    @M0rDoK, quién se abrío primero?

    @SANDRA, @Rafel te puse el códig, gracias!

    Saludos,

  5. creo que est abien la explicacion, aunque creo que es mejor pasar parametros entre clases, utilizando propertys, ya que coneste metodo de variable publica, te pueden aparecer errores asociados al ambito de las variables.

  6. Hola!! Estoy trabajando con visual basic 2005 que utiliza codigo html y me gustaria saber como pasar de un .aspx (que sería un formulario) a otro una variable. Gracias!!

  7. Está genial el ejemplo, muchas gracias!!

    Lo único, que no sabía como asignarle al botón el DialogResult::OK.
    Lo busqué por ahí y era algo tan simple como:

    button1->DialogResult = ::DialogResult::OK;

    Gracias de nuevo!!!

  8. Hola a todos, estoy usando forms para windows c#, tengo un formulario padre (Formulario), donde capturo la información de usuarios y a la hora de capturar su huella digital abro un nuevo form (huella) donde la capturo, valido que este bien y la guardo en un picturebox2. Después cuando le doy Ok, cierro ese form (huella) y me regresa a (Formulario)

    Lo que NO he podido hacer es que cuando le doy cerrar al form (Huella) me envíe la foto que tengo en mi picturebox2 a un picturebox que tengo en mi form principal (Formulario)…

    Podrian auxiliarme por favor.

    Gracias

  9. Orale, necesitaba de algun modo el contenido de un form2 pasarlo al form1 y con esto funciona perfecto, batalle para dar con este link pero valio la pena. Gracias

  10. Buenas tardes amigo, estoy realizando una aplicacion en C#, yo tengo form1 y form2, al hacer click en un boton contenido en form1 se muestra el form2, sin problemas…Hice como bien explicastes lo siguiente:

    Form2 f2 = new Form2(“Perfil de Temperatura”,label1.Text,label2.Text);
    form2.
    label1.Text y label2.Text son dos etiquetas del form1, a la primera vez me funciona perfecto, pero como esos valores de label1.Text y label2.Text estan cambiando constantemente, no logro hacer que ese par de valores los pueda cargar al form2, y que no se mantengan constantes los dos valores de label1.Text,label2.Text que cargué al mandar a mostrar form2.ShowDialog();

    Espero puedas ayudarme en estos dias, te lo agradecería, este es mi correo: cyvitriago@hotmail.com, si puedes o pueden demas lectores enviarme info de como solucionar mi inconveniente…Gracias 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *