none
pasar valor de un form abierto a otro form abierto RRS feed

  • Pregunta

  • Hola Amigos:

    Tengo un form1 el cual esta abierto y tiene varios textbox entre ellos el llamdo "textbox1", asi tambien tiene un  boton  llamado "boton1".

    Al dar clic al boton1, abre un form2 en ShowDialog() que contiene un datagridview, al dar doble clic a dicho datagridview, obtengo un valor de la celda seleccionada y lo almaceno en una variable publica tipo string declarada en form2  llamada "valor".

    La pregunta es:

    Como hago para que el valor de esta variable, se plasme en el textbox1 del form1 el cual se encuentra abierto detras del form2?

    De antemano gracias...


    A_R_I_E_S

    sábado, 16 de julio de 2016 5:54

Respuestas

  • Hola A_r_i_e_s,

    Puedes hacer esto :

    [1] Primera opción

    - Activa esta propiedad en el TextBox del Form1, para poder acceder desde el Form2.

    Luego en el Form2 :

    Agregas el using System.Linq;

         private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                Form1 f1 = Application.OpenForms.OfType<Form1>().SingleOrDefault();
    
                if (f1 != null)
                {
                    //Donde Cells[0] = Columna 1, posición 0
                    f1.textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                    this.Close(); //Cierro el form2
                }
            }

    Y así puedes acceder al control.

    [2] Segunda Opción

    También puedes mandar la instancia del Form1 en el constructor :

    Form1 :

        private void boton1_Click(object sender, EventArgs e)
            {
                //Envia el Form1 (this)
                Form2 f2 = new Form2(this);
                f2.ShowDialog();
            }

    Form2 :

            private Form1 f1;
    
            public Form2(Form1 form1)
            {
                InitializeComponent();
                this.f1 = form1;
            }
    
            private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                if (f1 != null)
                {
                    //Donde Cells[0] = Columna 1, posición 0
                    f1.textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                    this.Close(); //Cierro el form2
                }
            }

    [3] Tercera opción

    Usar los DialogResult :

    Form 1 :

          private void boton1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.ShowDialog();
    
                if(f2.DialogResult == DialogResult.OK)
                {
                    textBox1.Text = f2.valor;
                }
            }

    Form 2 :

           public string valor;
    
            private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                valor = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                DialogResult = DialogResult.OK;
                this.Close(); //Cerramos
            }

    Espero te ayude.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta Willams Morales sábado, 16 de julio de 2016 16:06
    • Marcado como respuesta A_r_i_e_s domingo, 17 de julio de 2016 0:12
    sábado, 16 de julio de 2016 6:21

Todas las respuestas

  • Hola A_r_i_e_s,

    Puedes hacer esto :

    [1] Primera opción

    - Activa esta propiedad en el TextBox del Form1, para poder acceder desde el Form2.

    Luego en el Form2 :

    Agregas el using System.Linq;

         private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                Form1 f1 = Application.OpenForms.OfType<Form1>().SingleOrDefault();
    
                if (f1 != null)
                {
                    //Donde Cells[0] = Columna 1, posición 0
                    f1.textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                    this.Close(); //Cierro el form2
                }
            }

    Y así puedes acceder al control.

    [2] Segunda Opción

    También puedes mandar la instancia del Form1 en el constructor :

    Form1 :

        private void boton1_Click(object sender, EventArgs e)
            {
                //Envia el Form1 (this)
                Form2 f2 = new Form2(this);
                f2.ShowDialog();
            }

    Form2 :

            private Form1 f1;
    
            public Form2(Form1 form1)
            {
                InitializeComponent();
                this.f1 = form1;
            }
    
            private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                if (f1 != null)
                {
                    //Donde Cells[0] = Columna 1, posición 0
                    f1.textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                    this.Close(); //Cierro el form2
                }
            }

    [3] Tercera opción

    Usar los DialogResult :

    Form 1 :

          private void boton1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.ShowDialog();
    
                if(f2.DialogResult == DialogResult.OK)
                {
                    textBox1.Text = f2.valor;
                }
            }

    Form 2 :

           public string valor;
    
            private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                valor = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                DialogResult = DialogResult.OK;
                this.Close(); //Cerramos
            }

    Espero te ayude.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta Willams Morales sábado, 16 de julio de 2016 16:06
    • Marcado como respuesta A_r_i_e_s domingo, 17 de julio de 2016 0:12
    sábado, 16 de julio de 2016 6:21
  • A_r_i_e_s,

    Definitivamente la tercera opción que te ofrecen es la mas adecuada, con la siguiente acotación: siendo que un formulario es una clase que hereda de Form, los campos (variables) deben mantenerse en un ámbito de clase, las propiedades son el mecanismo para establecer u obtener un valor al exterior, bajo ese enfoque deberías cambiar la siguiente parte (Código tomado de Joel)

    Public Property valor() As String
    
    private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                ...
            }

    ¿Hay un problema si se usa un campo y no una propiedad?

    Ninguno, el mundo no se detendrá, pero depende cuál sea el ámbito de la palabra problema, de que el código funciona, sin duda funciona, pero hay buenas practicas que son recomendables seguir. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 16 de julio de 2016 16:08
  • Gracias a ambos su ayuda, al final me fui por la segunda opcion de Williams, es mas que suficiente.


    A_R_I_E_S

    domingo, 17 de julio de 2016 0:13
  • Te presento una forma del como manejo showDialog y aparir   de eso podras realizarlo

    /////////Hasta aqui estoy en un Form numero 1

     ManagerPersona manager = new ManagerPersona();        ///Este el el form 2
                Object objTemps = manager.ShowDialog(this, null); //Aqui obtengo un objeto cualquiera ya despues de que el usuario ingreso del otro lado (Form 2) sus datos
                Persona conf = (Persona)objTemps;

    FORM 2

     public Object ShowDialog(Form _parent, Object _Obj) /// resivo form padre y un objeto (puede ser nullo en este caso)
            {
                this.baseEntity = (Persona)_Obj;
                this.idPersona = (this.baseEntity != null) ? this.baseEntity.id : 0; compruebo si el obj es nullo o no
                if (idPersona == 0)
                {
                    this.baseEntity = new Persona();

                }

                //this.idEstatusPer = this.baseEntity.idConCatEstadoPersona; ////aqui
                this.setLoadInformation();
                this.ShowDialog(_parent);

                return (this.baseEntity != null) ? this.baseEntity : null;   //Regreso datos (Objeto)

            }

    lunes, 18 de julio de 2016 0:18
  • hola

    >>Como hago para que el valor de esta variable, se plasme en el textbox1 del form1 el cual se encuentra abierto detras del form2?

    para comunicar formularios, NUNCA accedas directo a los controles de un form desde el otro, es una epsima practica que rompe con todos los conceptos de orientado a objetos

    aqui

    Comunicar Formularios

    explico como podrias cominicar forms y pasar datos de forms desacoplada usando buenas practicas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 18 de julio de 2016 3:20
  • Muchisimas gracias amigo de verdad, me has salvado la vida :)
    miércoles, 12 de diciembre de 2018 23:02