Desvendando os segredos do Data Binding no VB.NET- II


No artigo - Desvendando os segredos do Data Binding no VB.NET  I ,  abordei os aspectos básicos do Data Binding e sua teoria. Neste artigo vou mostrar alguns exemplos práticos de utilização do Data Binding.

Se você ler o artigo anterior vai notar que eu disse que uma nova característica importante da Vinculação (Binding) no VB.NET é a capacidade de vinculação de qualquer propriedade de um controle ou formulário a uma fonte de dados. Vamos então ver um exemplo de como fazer a vinculação de várias propriedades de um vez.

1- Fazendo o Data Binding de várias propriedades

Vou mostrar algo que você pode usar na prática. Que tal guardar a posição de fechamento de seu formulário de maneira que quando sua aplicação for iniciada o formulário abrirá naquela mesma posição ?  Lembra como você fazia isto no VB5/6 ? Bem , você guardava e recuperava a posição do registro do Windows , certo !!! Em tempos de VB.NET vamos usar um arquivo XML para armazenar esta informação ... Siga-me...

1- Inicie uma nova aplicação Windows no Visual Studio .NET (ou no VB.NET) dando a ela um nome sugestivo : GuardaPosicaoForm

2- Na caixa de ferramentas (Toolbox) clique na aba Data e arraste o componente DataSet para o seu formulário. Você verá a janela - Add DataSet - lhe perguntando se você quer usar um DataSet tipado (Typed) ou um DataSet não tipado (UnTyped). Selecione : Untyped e clique em OK. (veja na figura abaixo)

3- Você acabou de incluir um controle no seu formulário(na verdade em uma região abaixo do seu formulário: Component Tray) que esta disponível em toda a aplicação mesmo embora não seja visível em tempo de execução e sem que você precisa declará-lo explicitamente.

Como ainda não há dados o DataSet ele não vai fazer nada . Vamos então criar uma fonte de dados para alimentar este faminto DataSet. Vamos dar a ele um arquivo XML ; digite o código do arquivo XML abaixo em um editor qualquer e salve-o em disco :

- Você deve respeitar a formatação do arquivo XML

- O arquivo XML possui tags que devem ser abertas e fechadas.

- Este arquivo irá guardar a posição de fechamento do formulário . Note as propriedades : Height , Width , Top e Left.

A ideia é a seguinte:

- Este arquivo XML irá permitir ao DataSet (com um nome interno de : ConfiguracaoDados) ser carregado. O DataSet irá conter uma DataTable chamado Configuracao e o DataTable irá possuir quatro campos :  Height , Width , Top e Left.

- Supondo que o arquivo XML foi salvo no caminho c:\teste\ConfigPosicao.xml vamos criar o código a seguir para definir a posição e tamanho do formulário que serão salvas no DataSet. Ponha este código no evento Load do formulário :

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

 

DataSet1.ReadXml("c:\teste\ConfigPosicao.xml")

 

Me.DataBindings.Add(New Binding("Height", DataSet1, "Configuracao.Height"))

Me.DataBindings.Add(New Binding("Width", DataSet1, "Configuracao.Width"))

Me.DataBindings.Add(New Binding("Top", DataSet1, "Configuracao.Top"))

Me.DataBindings.Add(New Binding("Left", DataSet1, "Configuracao.Left"))

End Sub

No código acima eu estou carregando DataSet com o arquivo ConfigPosicao.xml  usando o método ReadXml() do DataSet. Não estou usando um DataAdapter e mesmo assim vou poder fazer a vinculação sem problemas.

Como o VB.NET formulários herdam (inherits) da classe Control podemos fazer a vinculação de suas propriedades , no caso as que dizem respeito a tamanho e posição , aos campos correspondentes do DataSet. É isto que estou fazendo no restante do código.

O construtor do objeto Binding ( New Binding)  precisa do nome da propriedade (como uma string) , o objeto que esta funcionando como Container e o campo de dado no container com o qual eu vou fazer a vinculação. Acima eu estou usando uma referência hierárquica para os campos. Nesta referência primeiro eu especifico o DataTable no DataSet (Configuracao) e então o campo usado na tabela.(Height,Widht, etc.)

Pronto , sem muitas complicações , o código acima irá recuperar a posição e tamanho do formulário quando ele for carregado. Para salvar estas informações no arquivo XML quando o formulário for fechado precisamos acrescentar as seguintes linhas de código no evento Closed do formulário:

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed

Me.DataBindings.Item("Height").BindingManagerBase.EndCurrentEdit()

DataSet1.WriteXml("c:\teste\ConfigPosicao.xml")

End Sub

A primeira linha do código acima informa à propriedade BindingManagerBase do objeto Binding que a edição atual foi finalizada e transfere os dados para o DataSet. Como todas as propriedades compartilham o mesmo BindingManagerBase , fazendo isto para um propriedade Height as demais serão atualizadas na mesma operação. Após isto o DataSet contém os valores para a posição e tamanho do formulário ; para salvar no DataSet usamos o método WriteXml().

É só isto , execute a aplicação e o formulário será aberto , redimensione o o formulário e feche-o. Quando você abrir novamente o formulário ele abrirá na posição e com o tamanho que tinha quando foi fechado.

2- Vinculando Caixas de Lista (ListBox) e caixas de combinação ( Combobox)

Nem preciso falar que exibir informações em uma caixa de listagem ou caixa de combinação é uma das tarefas mais corriqueiras e frequentes em uma aplicação. Geralmente o que se quer é exibir uma lista com nomes ou descrição para o usuário e fazer o tratamento interno destes valores associando-os a códigos numéricos. Também nesta área o VB .NET trouxe boas novidades.

Os controles ListBox e ComboBox em formulários Windows Forms podem ser vinculados a um container de dados como um DataTable (dentro ou fora de um DataSet) ou a um ArrayList. O container de dados pode conter diversos campos . Qual campo podemos exibir ao usuário em um listbox ou combobox ?

Resposta: A propriedade que define qual campo será exibido em ambos os controles é a propriedade : DisplayMember.  Exemplo:

Se um objeto DataTable contém campos para CodigoCliente , NomeCLiente e EnderecoCliente . Definindo a propriedade DisplayMember em um controle combobox para NomeCliente fará com que os valores para este campos sejam exibidos na combobox.

Até aqui tubo bem ? Vamos supor que você quer exibir o nome do cliente , mas a sua lógica interna precisa obter o código do cliente. Como Fazer ?

Resposta: Neste caso você define outra propriedade do controle chamada ValueMember para CodigoCliente. Isto fará com que o controle exiba o nome do cliente mas retorne o código do cliente após a seleção do usuário.

Vou mostrar um exemplo que usar um arquivo XML que contém alguns dados de clientes fictícios. O código do arquivo clientes.xml é :

<?xml version="1.0" standalone="yes"?>
<Clientes>
  <Cliente>
    <CodigoCliente>100</CodigoCliente>
    <NomeCliente>Macoratti</NomeCliente>
    <EnderecoCliente>R. Teste 100</EnderecoCliente>
  </Cliente>
  <Cliente>
    <CodigoCliente>200</CodigoCliente>
    <NomeCliente>Miriam</NomeCliente>
    <EnderecoCliente>Av. XV Novembro 100</EnderecoCliente>
  </Cliente>
  <Cliente>
    <CodigoCliente>300</CodigoCliente>
    <NomeCliente>Jessica</NomeCliente>
    <EnderecoCliente>Pca da Luz , 123</EnderecoCliente>
  </Cliente>
  <Cliente>
    <CodigoCliente>400</CodigoCliente>
    <NomeCliente>Jefferson</NomeCliente>
    <EnderecoCliente>Av. Mirassol , 230</EnderecoCliente>
  </Cliente>
  <Cliente>
    <CodigoCliente>500</CodigoCliente>
    <NomeCliente>Janice</NomeCliente>
    <EnderecoCliente>Rua Projetada , 23</EnderecoCliente>
 </Cliente>
</Clientes>

1- Inicie uma nova aplicação Windows no Visual Studio .NET (ou no VB.NET) dando a ela um nome sugestivo : GuardaPosicaoForm

2- Na caixa de ferramentas (Toolbox) clique na aba Data e arraste o componente DataSet para o seu formulário. Você verá a janela - Add DataSet - lhe perguntando se você quer usar um DataSet tipado (Typed) ou um DataSet não tipado (UnTyped). Selecione : Untyped e clique em OK.

3- Insira no formulário um controle Listbox - listbox1 - e um controle Button : button1.

4- Coloque o seguinte código no evento Load do formulário - form1.vb:

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

 

DataSet1.ReadXml("c:\teste\clientes.xml")

ListBox1.DataSource = DataSet1.Tables(0)

ListBox1.DisplayMember = "NomeCliente"

ListBox1.ValueMember = "CodigoCliente"

End Sub

5- Agora para exibir o valor selecionado pelo usuário , digite o código abaixo no evento CLick do botão : Exibir seleção:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  MsgBox(ListBox1.SelectedValue)

End Sub

Executando o projeto e selecionado um item teremos:

O propriedade SelectedValue da caixa de listagem exibe o valor selecionado. Como definimos a propriedade ValueMember para o CodigoCliente , o valor do código do cliente será exibido.

3- Vinculando controles a um ArrayList

Como já falei antes podemos fazer a vinculação de dados no VB.NET usando diferentes tipos de fontes de dados. Então vou mostrar um exemplo que usar um ArrayList.

O que é um ArrayList ? Ora ! é um container para objetos ; seu conceito é similar ao de vetores , mas que pode se expandir para incluir novos elementos.  Em um ArrayList podemos armazenar valores simples como strings ou objetos instanciados de uma classe.

Tomando como base o exemplo anterior , onde armazenamos os dados dos clientes em um XML e por sua vez em um DataSet , vamos supor que as informações estejam armazenadas em objetos Clientes. Neste caso os objetos clientes poderão ser armazenados em um ArrayList que por sua vez pode ser vinculado a uma caixa de listagem. Certo ?

Vamos ver a coisa funcionando. Precisamos de um objeto Cliente. Vamos aproveitar o mesmo projeto anterior e incluir um módulo de classe com o nome de Cliente.vb.

  • Clique com o botão direito do mouse sobre o nome do projeto e selecione as opções Add e a seguir Add Class

 

  • Informe o nome Cliente.vb para classe

Inclua o código abaixo no módulo de classe :

Public Class Cliente

 

Private msNomeCliente As String

Private msCodigoCliente As String

Public Sub New(ByVal sCodigoCLiente As String, ByVal sNomeCliente As String)

   Me.msCodigoCliente = sCodigoCLiente

   Me.msNomeCliente = sNomeCliente

End Sub

 

Public Property CodigoCLiente() As String

   Get

        Return msCodigoCliente

   End Get

   Set(ByVal Valor As String)

        msCodigoCliente = Valor

   End Set

End Property

 

Public Property NomeCliente() As String

    Get

        Return msNomeCliente

    End Get

    Set(ByVal Valor As String)

        msNomeCliente = Valor

    End Set

End Property

Acabamos de definir uma classe para tratar o objeto Cliente. Vamos agora incluir o seguinte código no evento Load do formulário:

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

 

Dim clientes As New ArrayList()

 

 clientes.Add(New Cliente("100", "Macoratti"))

 clientes.Add(New Cliente("200", "Miriam"))

 clientes.Add(New Cliente("300", "Janice"))

 clientes.Add(New Cliente("400", "Jefferson"))

 clientes.Add(New Cliente("500", "Jessica"))

 

ListBox1.DataSource = clientes

ListBox1.DisplayMember = "NomeCliente"

ListBox1.ValueMember = "CodigoCliente"

 

End Sub

Explicando:

  1. Defini um ArrayList com o nome clientes

  2. Inclui cinco objetos Cliente no ArrayList. (Eu usei o construtor da classe para criar 5 objetos novos)

  3. Defini as propriedades DisplayMember e ValueMember

Se você rodar o programa obterá o mesmo resultado do exemplo anterior.

4- Vinculando controles a um array simples

Para encerrar e para mostrar a flexibilidade da vinculação de dados no VB.NET vou fazer a vinculação usando um array simples como fonte de dados. Como na plataforma .NET basicamente qualquer coisa que implemente a interface IList pode servir como uma fonte de dados , os arrays por implementarem esta interface podem ser usados como fonte de dados.

Vamos ao exemplo:

1- Inicie uma nova aplicação Windows no Visual Studio .NET (ou no VB.NET) dando a ela um nome sugestivo : GuardaPosicaoForm

2- Insira no formulário um controle Listbox - listbox1 - e um controle Button : button1.

3- Na seção de declaração do formulário digite :

Dim sTimes() As String = {"Cruzeiro" , "Santos" , "São Paulo" , "Curitiba" }

4- No evento Load do formulário insira a linha de código :

ListBox1.DataSource = sTimes()

5- No Evento Click do botão de comando , digite :

MsgBox(ListBox1.SelectedValue)

Agora rode o programa e veja que a caixa de listagem exibirá os valores definidos no array. Ao efetuar uma seleção o valor selecionado será exibido:

Com isto você acompanhou uma visão geral do poder e flexibilidade da vinculação de dados na plataforma .NET.

Romanos 7:14 Porque bem sabemos que a lei é espiritual; mas eu sou carnal, vendido sob o pecado.

Romanos 7:15 Pois o que faço, não o entendo; porque o que quero, isso não pratico; mas o que aborreço, isso faço.

Romanos 7:16 E, se faço o que não quero, consinto com a lei, que é boa.

Romanos 7:17 Agora, porém, não sou mais eu que faço isto, mas o pecado que habita em mim.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti