none
Cambiar el texto a un label desde otro From RRS feed

  • Pregunta

  • Tengo en un from3.cs una variable double que tiene un valor (por ejemplo:3).

    Dicho valor se lo quiero pasar a un label1.text que esta en from1.cs.

    ¿Cómo lo puedo hacer? 

    miércoles, 6 de junio de 2012 7:13

Todas las respuestas

  • Pues depende...

    Form3 es modal o no modal?

    Si Form3 es modal declaras una propiedad (p.ej. Valor en Form3) y después de llamar a ShowDialog() desde Form1 actualizas el valor de la label1 con el valor de la propiedad.

    // Codigo en Form3
    public double Valor
    {
       // _valor es la variable double de Form3
       get { return { _valor;}}
    }
    // Codigo en Form1
    using (var frm = new Form3())
    {
        //...
        frm.ShowDialog();
        label1.Text = frm.Valor.ToString();
    }

    Si Form3 NO es modal entonces tienes dos opciones: o al constructor de Form3 le pasas la instancia de Form1 y usas una propiedad (que creas en Form1) para actualizar la label desde Form3. O bien usas eventos (lanzas un evento desde Form3 al modificar la variable y te suscribes a él desde Form1). La primera de esas opciones sería algo como:

    // Codigo en Form1
    public string TextoLabel1
    {
       get { return label1.Text;}
       set { label1.Text = value;}
    }
    // En algun sitio se crea y muestra Form3:
    var frm1 = new Form3(this);
    frm1.Show();
    // Codigo en Form3
    private Form1 _form1;
    // Debes buscar el constructor y modificarlo añadiendo el parámetro Form1:
    public Form3 (Form1 form1)
    {
        InitializeComponents();  // Esta línea ya estará en el constructor original
        _form1 = form1;
    }
    // Cuando, desde Form3 quieras modificar el texo de Form1 (_valor es la variable double)
    _form1.TextoLabel1 = _valor.ToString();

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 7 de junio de 2012 6:56
  • Hola eduard,

    From3 es modal, tengo problemas:

    // escribo esto en From1:

    namespace Pasar_valores_de_from_3_a_from1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form nuevo = new Form3();
                nuevo.ShowDialog();
                label1.Text= nuevo.a; //Aqui hay problemas en a    me dice que no contiene definición de a 
            }
            
        }
    }

    En From 3 tengo esto:

    namespace Pasar_valores_de_from_3_a_from1
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            public double a;
        {
           get { return { 23;}}  // no se puede encontrar el tipo o el nobre de espacio get.
        }

        }
    }

    ¿Qué hago mal?

    Gracias

    jueves, 7 de junio de 2012 7:38
  • Buenas!

    Haces:

            public double a;
        {
           get { return { 23;}}  // no se puede encontrar el tipo o el nobre de espacio get.
        }

    Quita el ; despues de a

    public double a
    {
       get { return 23; }
    }

    Con eso estás creando una propiedad read-only llamada "a" que devuelve siempre 23.

    Si lo que quieres es devolver el valor de una variable desde la propiedad:

    private double _a;
    public double A 
    {
     get{ return _a;}
    }

    Un saludo!

    PD: Las propiedades suelen empezar su nombre por mayúscula (A en lugar de a p.ej.)


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 7 de junio de 2012 7:50
  •  Tengo un problema aún,

    En from1 tengo...

    {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form nuevo = new Form3();
                nuevo.ShowDialog();
                label1.Text= nuevo.a.ToString();
            }
    a me dice que no contiene una definición de 'a' ni se encontro ningún método de extensión 'a'

    ¿qué puede ser?

           
    jueves, 7 de junio de 2012 8:02
  • Buenas!
    Lo de label1.Text= nuevo.a.ToString(); te debería funcionar si la propiedad en Form3 se llama "a", es decir si has hecho:

    public double a
    {
       get { return 23; }
    }

    Pero si has usado "A" (como te sugería yo) entonces debes hacer nuevo.A.ToString().

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 7 de junio de 2012 8:09
  • Hola de nuevo,

    Te envio el código, supongo que será "una tonteria" que me estoy saltando pero no lo veo.

    Al pulsar button1 me abre la ventana from3 sim problemas pero el texto no me lo pone

    Gracias

    namespace Pasar_valores_de_from_3_a_from1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form nuevo = new Form3();
                nuevo.ShowDialog();
                label1.Text = nuevo.a.ToString();  //el unico error que me da es en la a
             }
            
        }
    }

    namespace Pasar_valores_de_from_3_a_from1
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            public double a
        {
           get { return 23;}
        }

        }
    }

    jueves, 7 de junio de 2012 8:19
  • Dentrro del error tambien me pone esto

    ¿Falta una directiva de uso o una referencia de ensamblador?

    jueves, 7 de junio de 2012 8:22
  • xD
    Lo tengo! He tenido que activar el parser mental de C# para encontrar el error :P

    Form3 nuevo = new Form3();
    nuevo.ShowDialog();
    label1.Text = nuevo.a.ToString();

    Debes declarar la variable nuevo como Form3 no como Form.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Propuesto como respuesta cutuche1 jueves, 7 de junio de 2012 8:31
    jueves, 7 de junio de 2012 8:23
  • Gracias funciona bien.

    Otra duda si el button1 estuviera en From3 y no en From1, es decir cambiar el label1.Text que esta en From1 desde un button que esta en From3.

    Yo pongo:

    Estando en From3

    private void button1_Click(object sender, EventArgs e)
            {
                From1 nue = new From1(); //Error en los 2 From1
                nue.label1.text = a.ToString();

    }

    Como lo puedo hacer

    jueves, 7 de junio de 2012 8:38
  • Buenas!

    Entonces debes usar la segunda técnica que te decía en el primer post, pasar en el constructor de Form3 la instancia de Form1. Porque entiendo que es Form1 quien "abre" un Form3, no? Y debes crear en Form1 una propiedad (TextoLabel) que permita modificar la propiedad Text del label.

    Mira mi primera respuesta, que dice como puedes hacerlo!

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 7 de junio de 2012 8:42
  • El from1 abre el from3.

    jueves, 7 de junio de 2012 9:08
  • He creado otro proyecto nuevo para no mezclarlo con lo anterior.

    Decir que en vez de utilizar un form3 (como comento en el namespace he creado un from2) este es el codigo que pongo en From1 ...

    namespace pasar_datos_de_form3_a_from1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            public string TextoLabel1
            {
                get { return label1.Text; }
                set { label1.Text = value; }
            }

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

        }
    }
    Hasta aqui todo bien.

    En el from2 ...

    namespace pasar_datos_de_form3_a_from1
    {
        public partial class Form2 : Form
        {
            public Form2(From1 form1)  //tengo problemas en todo lo señalado no se puede encontrar el tipo o el nombre de espacio de nombres 'From1'
            {
                InitializeComponent();
                _form1=form1;  //El nombre from1 no se encuentra en el contexto actual
            }

            private From1_form1;  //no se puede encontrar el tipo o el nombre de espacio de nombres 'From1'
            public double a=23;
            private void button1_Click(object sender, EventArgs e)
            {
               _from1.TextoLabel1= a.ToString();  //El nombre from1 no se encuentra en el contexto actual

            }
        }
    }

            Que puede pasar?
    jueves, 7 de junio de 2012 9:31