VB .NET -  Passando valores entre formulários


Existe uma dúvida recorrente para quem esta começando a aprender a linguagem VB .NET.

Como passar valores de um formulário para outro em uma aplicação Windows Forms ?

Neste artigo eu mostro algumas maneiras de realizar esta tarefa, embora existam muitos outras formas.

Eu vou usar o Visual Basic 2010 Express Edition para criar o projeto exemplo deste artigo.

Abra o VB 2010 Express e crie um novo projeto Windows Forms no menu File -> New Project -> Windows Forms Application , e informe o nome passandoValoresEntreFormularios e clique em OK;

Será criado a solução contendo o formulário form1.vb.

A seguir inclua um segundo formulário no projeto no menu Project -> Add Windows Forms e aceite o nome padrão form2.vb.

A seguir inclua um controle TextBox , um controle Label e um controle Button no formulário form1.vb conforme figura abaixo:

A seguir inclua no formulário form2.vb um controle Label e um controle ListBox conforme a figura abaixo:

Nosso objetivo é  mostrar como passar valores do formulário form1.vb para o formulário form2.vb.

Embora, como eu já disse, existam muitas formas de passar valores entre formulários, esse artigo aborda 3 maneiras de realizar esta tarefa as quais são:

1-) Passando valores entre formulários : usando um construtor

Usar um construtor é uma das formas mais fáceis de passar valores entre formulário dependendo da situação.

Para tanto você precisa saber o que é um construtor. Abaixo eu vou dar a definição que foi tirada de um de meus artigos (veja as referências):

O que é um Construtor ? Um construtor , é um método especial que deve estar presente em uma classe para que a classe possa ser instanciada. Um construtor também é usado para inicializar as variáveis membros da classe.

No VB.NET este método é usado com o nome de New.

Quando você instancia um objeto usando a palavra-chave
New  o construtor da classe é chamado automaticamente e se você definir um construtor para sua classe é ele que será chamado. 

Quando não definimos um método construtor o VB.NET cria um construtor padrão automaticamente para nós.

Então um construtor é um método que controla a inicialização de um objeto e você pode usá-lo para realizar as operações necessárias á incialização de um objeto.

O VB.NET permite que você crie  uma rotina Sub New() dentro da sua classe para criar um construtor. O construtor é executado apenas uma vez quando você criar a instância do objeto.

Se você ainda não sabe os formulários são classes, se você duvida, basta abrir o código de um formulário para ver a declaração : Public Class Form1

Dessa forma podemos definir um construtor no formulário form2 preparando-o para receber o que desejamos passar. No exemplo eu quero passar uma string, então vamos abrir o formulário form2 na visão de código e definir o seguinte construtor:

Observe que no construtor definimos o parâmetro valorForm1 como uma string que será recebido e incluído no controle ListBox.

Agora o form2 esta preparado para receber o valor que desejamos passar.

E agora ? Como passamos o valor ?

Simplesmente devemos , no formulário form1.vb, criar uma instância do formulário form2.vb passando o valor da seguinte forma:

Agora é só executar o projeto e clicar no botão  - Chamar form2.vb - do formulário form1.vb para que o valor seja passado para o formulário form2.vb conforme mostra a figura a seguir:

2-) Passando valores entre formulários : usando objetos

Para usar este método você tem que saber que objetos são tipos de referência e são criados no heap e não na pilha, quando usamos a palavra chave new.

Tipos de dados por Valor e por referência

Um tipo de dado e considerado tipo por valor se ele trata o dado dentro da sua própria alocação de memória. Já um tipo de dado por referência contêm um ponteiro para outra alocação de memória que gerencia o dado.

Os tipos por valor incluem:

  • Todos os tipos de dados numéricos.(Byte - Short - Int - Long - Single - Double - Decimal)
  • Boolean, Char, e Date
  • Todas as estruturas(struct) , mesmo se seus membros são tipos de referência.
  • A enumerações (Enum) desde que seus tipos correspondentes sejam sempre : Byte, Short, Integer, ou Long

Os tipos por referência incluem:

  • String
  • Todos os vetores(arrays) , mesmo se seus elementos são tipos de valor
  • Tipos Classes , como um Form
  • Object
  • Class
  • Interface
  • Delegate

Observação : O tipo String possui as seguintes características especiais:

  • Não precisa ser iniciado com o operador New
  • Uma string contendo um Null é uma string vazia
  • Não podemos criar uma classe derivada de String
  • Strings contém caracteres unicode e podem ter até 1 Giga de comprimento

Vamos então passar valores entre os formulários usando objetos da seguinte forma:

  1. No formulário form2 vamos instanciar a classe form1 definindo um objeto frm1;
  2. No evento Click do controle Button2 do formulário form1 vamos instanciar o formulário form2;
  3. Depois vamos passar o objeto form1 para o formulário form2 usando o objeto frm1 do formulário form2;
  4. Por fim vamos invocar a janela form2 através do método Show;

Parece um tanto confuso, mas com o exemplo vai clarear...

Para este exemplo ser executado temos que fazer os seguintes ajustes no projeto:

Agora no formulário form2 vamos declarar uma variável frm1 do tipo form1:

A seguir vamos definir o seguinte código no evento Click do controle Button2 do formulário form1:

Agora no evento Load do formulário form2 vamos incluir o código que recebe o valor do formulário form1:

Executando o projeto iremos obter:

3-) Passando valores entre formulários : usando propriedades

As propriedades são um dos conceitos fundamentais da orientação a objeto. Através das propriedades podemos acessar os estado de uma classe, sendo que elas encapsulam a informação de um objeto permitindo o acesso a elas de forma controlada.

Com isto concluímos que propriedades são variáveis especiais que permitem encapsular o código de uma classe.

Geralmente as propriedades possuem os procedimentos Get e Set mas podemos usar os modificadores :

  • ReadOnly - permite somente a leitura da propriedade - Só possui Get
  • WriteOnly  - permite somente a atribuição de valor a propriedade - Só possui Set

Para passar valores entre formulários usando propriedades vamos fazer o seguinte:

Para este exemplo ser executado temos que fazer os seguintes ajustes no projeto:

No formulário form1 vamos definir a propriedade text_Box1 somente leitura(ReadOnly) que obtém o valor da caixa de texto TextBox1 do formulário :

Em seguida no formulário form2 vamos definir a propriedade text_Box2 somente escrita (WriteOnly) que atribui o valor ao controle TextBox2:

No evento Click do controle Button3 vamos definir o código que obtém o valor da caixa de texto do formulário e atribui o valor a propriedade do formulário form2:

Executando o projeto iremos obter:

Uma outra forma bem simples de obter o valor de um controle de um formulário é usar o recurso My.Forms.

As classes My (disponíveis a partir da versão 2005 do VB .NET) são responsáveis pela criação de um atalho para recursos utilizados com muita freqüência e evitar a escrita de código para uma determinada funcionalidade.

Veja como é simples:

Inclua um botão no formulário form1 para chamar o formulário form2 e no seu evento Click inclua o seguinte código:

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

      My.Forms.Form2.Show()

End Sub

No formulário form2 no evento Load já podemos obter o valor do controle TextBox1 do formulário form1 usando o seguinte código:

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     TextBox3.Text = My.Forms.Form1.TextBox1.Text

End Sub

Executando o projeto teremos:

Podemos ainda usar delegates , interfaces, etc. mas creio que essas são as formas mais simples de passar valores entre formulários.   

Pegue o projeto completo aqui: passandoValoresEntreFormularios.zip

Eu sei á penas VB .NET, mas eu gosto...

Referências:


José Carlos Macoratti