none
Acessar uma variável do Form1 no Fomr2 RRS feed

  • Pergunta

  • Bom dia,

    Estou tento um grande problema para acessar uma variável do Form1 no Form2.
    Estou pegando o valor de uma textBox no Form1 e armazenando-o em uma variável pública do próprio Form1, no entando, quando vou acessar esse valor no carregamento do Form2, o mesmo fica zerado. Como posso resolver este problema?
    Segue abaixo os respectivos códigos do Form1 e Form2.

                        

    namespace WindowsFormsApplication1
    {

        public partial class Form1 : Form
        {

            public string meuTexto;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                meuTexto = textBox1.Text;
                MessageBox.Show(meuTexto);
                Form2 form2 = new Form2();
                form2.ShowDialog();
            }
        }
    }

    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                Form1 text = new Form1();
                MessageBox.Show(text.meuTexto);
            }
        }
    }

    Desde já agradeço.

    sexta-feira, 9 de outubro de 2015 13:35

Respostas

  • Olá, Higor!

       Para acessar o valor da sua variável do Form1 no Form2, você deve passa-la por parâmetro. Quando você escreve o código "Form1 text = new Form1();", uma nova instância do objeto Form é criada, ou seja, não tem nada a ver com a tela que você queria, pois é um objeto completamente novo. Para passar por parâmetro, pode ser assim:

    namespace WindowsFormsApplication1
     {
    
         public partial class Form1 : Form
         {
    
             public string meuTexto;
    
             public Form1()
             {
                 InitializeComponent();
             }
    
             private void Form1_Load(object sender, EventArgs e)
             {
    
             }
    
             private void button1_Click(object sender, EventArgs e)
             {
                 meuTexto = textBox1.Text;
                 MessageBox.Show(meuTexto);
                 Form2 form2 = new Form2(this.meuTexto);
                 form2.ShowDialog();
             }
         }
     }
    
    
    namespace WindowsFormsApplication1
     {
         public partial class Form2 : Form
         {
             public string textoForm1;
    
             public Form2(string meuTextoDoForm1)
             {
                 InitializeComponent();
    
                 this.textoForm1 = meuTextoDoForm1;
             }
    
             private void Form2_Load(object sender, EventArgs e)
             {
                 //Form1 text = new Form1();
                 MessageBox.Show(this.textoForm1);
             }
         }
     }

    É mais ou menos por aí. Bom trabalho!

    sexta-feira, 9 de outubro de 2015 13:56
  • Então Higor, muitas pessoas pergunta isso e temos vários posts tanto aqui no MSDN quando em diversos outros foruns pela web, e na verdade é muito simples.

    Primeiro precisamos saber o seguinte - o Form1 CHAMA o Form2? Tem um botão (por exemplo) no Form1 que ao ser clicado abre o Form2? Se for isso o acesso é muito simples:

    namespace MeuPrograma
    {
        public class Form2 : Form
        {
            public Form1 OFormQueChamou; //Assim você pode chamar this.OFormQueChamou.OTextoQueQuero ou então use uma string, mas ai se a string do Form1 sofrer alteração você não saberá
    
            public Form2(Form1 FormDataChamada) : base()
            {
                this.InitializeComponent();
                this.OFormQueChamou = FormDataChamada;
            }
        }
    
        public class Form1 : Form
        {
            public string OTextoQueQuero; //Pode ser internal ao invés de public, dependendo da sua necessidade.
    
            public void Button1_Click(object sender, EventArgs e)
            {
                Form2 OFormFilho = new Form2(this);
                OFormFilho.ShowDialog();
            }
        }
    }

    Se você fizer o que você escreveu (dar um New do Form1 no Form2 esse Form1 será uma nova instância do Form1 e consequentemente estará com a String vazia). Se esse não for o caso, então diga um pouco mais para darmos uma solução mais próxima a sua necessidade.

    sexta-feira, 9 de outubro de 2015 14:24

Todas as Respostas

  • Olá, Higor!

       Para acessar o valor da sua variável do Form1 no Form2, você deve passa-la por parâmetro. Quando você escreve o código "Form1 text = new Form1();", uma nova instância do objeto Form é criada, ou seja, não tem nada a ver com a tela que você queria, pois é um objeto completamente novo. Para passar por parâmetro, pode ser assim:

    namespace WindowsFormsApplication1
     {
    
         public partial class Form1 : Form
         {
    
             public string meuTexto;
    
             public Form1()
             {
                 InitializeComponent();
             }
    
             private void Form1_Load(object sender, EventArgs e)
             {
    
             }
    
             private void button1_Click(object sender, EventArgs e)
             {
                 meuTexto = textBox1.Text;
                 MessageBox.Show(meuTexto);
                 Form2 form2 = new Form2(this.meuTexto);
                 form2.ShowDialog();
             }
         }
     }
    
    
    namespace WindowsFormsApplication1
     {
         public partial class Form2 : Form
         {
             public string textoForm1;
    
             public Form2(string meuTextoDoForm1)
             {
                 InitializeComponent();
    
                 this.textoForm1 = meuTextoDoForm1;
             }
    
             private void Form2_Load(object sender, EventArgs e)
             {
                 //Form1 text = new Form1();
                 MessageBox.Show(this.textoForm1);
             }
         }
     }

    É mais ou menos por aí. Bom trabalho!

    sexta-feira, 9 de outubro de 2015 13:56
  • Então Higor, muitas pessoas pergunta isso e temos vários posts tanto aqui no MSDN quando em diversos outros foruns pela web, e na verdade é muito simples.

    Primeiro precisamos saber o seguinte - o Form1 CHAMA o Form2? Tem um botão (por exemplo) no Form1 que ao ser clicado abre o Form2? Se for isso o acesso é muito simples:

    namespace MeuPrograma
    {
        public class Form2 : Form
        {
            public Form1 OFormQueChamou; //Assim você pode chamar this.OFormQueChamou.OTextoQueQuero ou então use uma string, mas ai se a string do Form1 sofrer alteração você não saberá
    
            public Form2(Form1 FormDataChamada) : base()
            {
                this.InitializeComponent();
                this.OFormQueChamou = FormDataChamada;
            }
        }
    
        public class Form1 : Form
        {
            public string OTextoQueQuero; //Pode ser internal ao invés de public, dependendo da sua necessidade.
    
            public void Button1_Click(object sender, EventArgs e)
            {
                Form2 OFormFilho = new Form2(this);
                OFormFilho.ShowDialog();
            }
        }
    }

    Se você fizer o que você escreveu (dar um New do Form1 no Form2 esse Form1 será uma nova instância do Form1 e consequentemente estará com a String vazia). Se esse não for o caso, então diga um pouco mais para darmos uma solução mais próxima a sua necessidade.

    sexta-feira, 9 de outubro de 2015 14:24