Usuário com melhor resposta
Acessar uma variável do Form1 no Fomr2

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
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();
}
}
}
{
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.
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!
- Sugerido como Resposta Anderson Molina sexta-feira, 9 de outubro de 2015 14:30
- Marcado como Resposta Levi DomingosModerator domingo, 11 de outubro de 2015 10:29
-
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.
- Marcado como Resposta Levi DomingosModerator domingo, 11 de outubro de 2015 10:29
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!
- Sugerido como Resposta Anderson Molina sexta-feira, 9 de outubro de 2015 14:30
- Marcado como Resposta Levi DomingosModerator domingo, 11 de outubro de 2015 10:29
-
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.
- Marcado como Resposta Levi DomingosModerator domingo, 11 de outubro de 2015 10:29