Neste artigo, explicarei como trocar informa√ß√Ķes entre as janelas de uma aplica√ß√£o Windows Forms. Os c√≥digos de exemplo est√£o em C# mas no final do artigo tamb√©m est√° dispon√≠vel um sample em VB.NET.

N√£o existe apenas uma maneira para trocar dados entre Forms, mas no artigo ser√£o abordadas tr√™s formas que considero √ļteis para a maioria dos casos: por construtor, pela refer√™ncia de um Form aberto ou por EventHandler, mas primeiro vamos criar o visual da nossa aplica√ß√£o.

Crie um novo projeto do tipo Windows Forms (C#) e adicione dois novos Forms, os nomes podem ficar como Form1 e Form2.

No Form1 adicione os seguintes controles:

  • label1: Label
  • textBox1: TextBox
  • btnAbrirForm2: Button
Form1
Form1

No Form2 adicione os seguintes controles:

  • textBox1: TextBox
  • textBox2: TextBox
  • textBox3: TextBox (Deixe o BackGround de outra cor, aqui coloquei verde)
  • lstProdutos: ListBox
  • btnEventHandler: Button
  • btnOpenForms: Button
Form2
Form2

Pronto! O visual da aplicação já está criado, agora vamos ao que interessa, a comunicação entre as duas janelas.

1. Por construtor:

A comunica√ß√£o via construtor √© a que eu julgo mais f√°cil, mas vai ser √ļtil apenas quando a janela que voc√™ deseja passar os dados ainda n√£o estiver aberta ou instanciada.

Adicione o seguinte c√≥digo no Form2:

public Form2(List lista)
{
InitializeComponent();
foreach (string produto in lista)
{
lstProdutos.Items.Add(produto);
}
}

Neste c√≥digo, estamos criando um novo construtor para o Form2, sendo obrigat√≥ria a passagem de uma lista de strings por par√Ęmetro (que vir√° do Form1) e no nosso caso ser√£o produtos, com essa lista vamos atualizar o lstProduto adicionando cada string contida na lista.

No Form1, adicione o seguinte c√≥digo para o evento click do bot√£o "Abrir Form2":

private void btnAbrirForm2_Click(object sender, EventArgs e)
{
List listaProdutos = new List();
listaProdutos.Add("Mouse");
listaProdutos.Add("Notebook");
listaProdutos.Add("Teclado");
Form2 form2 = new Form2(listaProdutos);
form2.Show();
}

Nesse c√≥digo criamos uma lista de produtos de uma loja de inform√°tica e passamos por par√Ęmetro para o Form2. Compile e execute a aplica√ß√£o. Clique no bot√£o "Abrir Form2".

Form2 aberto
Form2 aberto

Como voc√™ pode ver, o Form2 j√° veio com uma lista de produtos carregada, enviada pelo Form1, mas a comunica√ß√£o ficar√° a seu crit√©rio, voc√™ pode passar quantos objetos voc√™ desejar e da maneira que precisar.

2. Pela referência de um Form aberto:

Esse tipo de comunica√ß√£o √© utilizada quando se deseja manipular um Form que j√° est√° aberto na aplica√ß√£o, obtendo sua refer√™ncia pela classe Application.

No Form2, adicione o seguinte c√≥digo para o evento click do bot√£o "OpenForms":

private void btnOpenForms_Click(object sender, EventArgs e)
{
//verifica se o Form1 est√° aberto
if (Application.OpenForms.OfType().Count() > 0)
{
Form form1 = Application.OpenForms["Form1"];
Label label1 = (Label)form1.Controls["label1"];
label1.Text = textBox1.Text;
form1.Text = textBox2.Text;
((TextBox)form1.Controls["textBox1"]).BackColor = textBox3.BackColor;
//aumenta o tamanho do form
form1.Size = new Size(400, 400);
}
else
{
MessageBox.Show("O Form1 n√£o est√° aberto!");
}
}
[/sourcecode]

Atrav√©s da propriedade Application.OpenForms, podemos encontrar uma cole√ß√£o de Forms que est√£o abertos na aplica√ß√£o, na primeira parte √© verificado se o Form1 est√° aberto, caso ele esteja, pegamos sua refer√™ncia e atribu√≠mos √† vari√°vel form1, atualizamos o Label, o TextBox e a propriedade Text do Form1 atrav√©s de propriedades dos controles do Form2, veja tamb√©m que n√£o transferimos apenas dados entre os Forms, mas tamb√©m atualizamos o tamanho de Form1.  Tamb√©m √© poss√≠vel executar m√©todos e eventos do Form1, conforme sua necessidade.

Compile seu projeto e execute a aplica√ß√£o, abra o Form2 atrav√©s do bot√£o criado no Form1, preencha os campos com os valores desejados e depois clique no bot√£o "OpenForms" e veja o resultado obtido no Form1.

Resultado Form1
Resultado Form1

3. Por EventHandler:

A terceira e √ļltima forma mostrada no artigo √© feita atrav√©s de eventos e delegates, n√£o vou entrar nesse assunto a fundo, mas caso voc√™ n√£o conhe√ßa como funciona, segue as refer√™ncias iniciais:

Delegates Tutorial (MSDN)

Events Tutorial (MSDN)

Adicione o seguinte c√≥digo no Form2:

[sourcecode language="csharp"]
public delegate void OnDataChangeHandler(Hashtable info);
public event OnDataChangeHandler OnDataChange;
[/sourcecode]

Neste c√≥digo, estamos criando o EventHandler e o delegate para o evento OnDataChange, que ser√° o notificador de mudan√ßa do Form2, para que futuramente o Form1 possa ser atualizado.

Ainda no Form2, adicione o seguinte c√≥digo para o evento click do bot√£o "EventHandler":

[sourcecode language="csharp"]
private void btnEventHandler_Click(object sender, EventArgs e)
{
Hashtable info = new Hashtable();
info.Add("Valor1", textBox1.Text);
info.Add("Valor2", textBox2.Text);
info.Add("textBox3", textBox3);
OnDataChange(info);
}
[/sourcecode]

Note que estamos utilizado um Hashtable para guardar os objetos que queremos passar do  Form2 para o Form1, o Hashtable √© passado por par√Ęmetro no evento OnDataChange. Caso voc√™ n√£o conhe√ßa um Hashtable, ele nada mais √© do que uma tabela que server para guardar objetos vinculados √† uma chave, veja a refer√™ncia.

No Form1, adicione o seguinte linha para o evento click do bot√£o "Abrir Form2", adicione tamb√©m o m√©todo form2_OnDataChange:

[sourcecode language="csharp" highlight="8"]
private void btnAbrirForm2_Click(object sender, EventArgs e)
{
List listaProdutos = new List();
listaProdutos.Add("Mouse");
listaProdutos.Add("Notebook");
listaProdutos.Add("Teclado");
Form2 form2 = new Form2(listaProdutos);
form2.OnDataChange += new Form2.OnDataChangeHandler(form2_OnDataChange);
form2.Show();
}

private void form2_OnDataChange(Hashtable info)
{
label1.Text = info["Valor1"].ToString();
this.Text = info["Valor2"].ToString();
textBox1.BackColor = ((TextBox)info["textBox3"]).BackColor;
this.Size = new Size(300, 155);
}
[/sourcecode]

Para entender melhor o que se passa por aqui, pense como se fosse uma assinatura de uma revista, voc√™ deseja receber em sua casa todos os meses uma determinada revista, ent√£o voc√™ assina para que receba mensalmente a revista em sua casa, o Form1 faz exatamente isso, implementa o EventHandler OnDataChange de Form2 (assinar revista) criando o evento form2_OnDataChange (receber revista), toda a vez em que o bot√£o "EventHandler" for clicado no Form2 (enviar revistas), esse evento ser√° executado, note que voc√™ poder√° fazer isso em quantos Forms voc√™ desejar e todos receber√£o a sua "revista".

No evento form2_OnDataChange, recebemos o Hashtable enviado por par√Ęmetro pelo Form2, buscamos por cada chave de refer√™ncia e atualizamos o Form1, note que alteramos novamente o tamanho do Form1.

Compile seu projeto e execute a aplica√ß√£o, abra o Form2 atrav√©s do bot√£o criado no Form1, preencha os campos com os valores desejados e depois clique no bot√£o "EventHandler" e veja o resultado obtido no Form1.

Por hoje vou ficando por aqui, espero que tenham aprendido, seguem os samples em C# e VB.NET, se divirta, comente, critique e n√£o deixe de tirar as suas d√ļvidas.

Projeto C#
Projeto VB.NET

Abraços, Thiago Coelho!