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.
|
|
Inclua o código abaixo no módulo de classe :
Public Class Cliente
Private msNomeCliente As String Private msCodigoCliente As StringPublic 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 PropertyPublic 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:
Defini um ArrayList com o nome clientes
Inclui cinco objetos Cliente no ArrayList. (Eu usei o construtor da classe para criar 5 objetos novos)
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#