VB .NET -  Sincronizando dados entre dois ListBox com DataView (iniciantes)


 Neste artigo vou mostrar como podemos sincronizar as informações de dois controles ListBox usando um DataView.

Eu já escrevi dezenas de artigos sobre a utilização do ListBox (
basta você googar 'Macoratti listbox' que vai encontrar muitas referências) e neste artigo vou recordar como podemos preencher dados relacionados em um ListBox e como selecionar um item em um listbox e exibir os itens relacionados no segundo listbox.

Volto portanto ao assunto, desta vez usando o Visual Studio 2015 Community numa abordagem feita para quem esta iniciando na linguagem.

É um artigo prático, e vamos realizar as seguintes operações:

Então vamos ao que interessa...

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Vbnet_FiltroListBox;

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

A seguir declare os seguintes namespaces no formulário:

Imports System.IO

Após a declaração do formulário inclua o código a seguir onde definimos as variáveis usadas no formulário:

Dim tabela As DataTable
Dim caminho As String

1-Preenchendo um array com dados de um arquivo texto e exibindo no ListBox

No evento Click do botão de comando -  Preencher Dados - inclua o código abaixo:

Private Sub btnPreencherLb1_Click(sender As Object, e As EventArgs) Handles btnPreencherLb1.Click
        GeraDados()
 End Sub

 Private Sub GeraDados()
        caminho = "C:\Dados\txt\paises.txt"
        Dim Paises() As String = File.ReadAllLines(caminho)
        lb1.Items.AddRange(Paises)
        tabela = New DataTable("Paises")
        CriarTabela(tabela)
        Dim dv As New DataView(tabela)
        lb2.DataSource = dv
        dv.Sort = "Nome"
        lb2.DisplayMember = "Nome"
 End Sub

Neste código estamos invocando o método GeraDados() onde temos o caminho do arquivo paises.txt (obtido neste link: https://gist.github.com/kalinchernev/486393efcca01623b18d)  definido na variável caminho.

A seguir criamos um array de strings chamado Paises() e usando o método ReadAllLines() da classe File lemos os dados do arquivo texto para o array.

A seguir exibimos os dados no Listbox - lb1 - usando o método AddRange() ListBox.

Depois chamamos o método CriarTabela() cujo código vemos a seguir:

Private Sub CriarTabela(ByVal tabela As DataTable)
        tabela.Columns.Add("Nome")
        tabela.Columns.Add("Pais")
        For i As Integer = 0 To 8
            tabela.Rows.Add(tabela.NewRow)
        Next
        tabela.Rows(0).ItemArray = {"Jose C Macoratti", "Brazil"}
        tabela.Rows(1).ItemArray = {"Igor Klausman", "Germany"}
        tabela.Rows(2).ItemArray = {"Mina Feng", "China"}
        tabela.Rows(3).ItemArray = {"Italo Sanfelicce", "Italy"}
        tabela.Rows(4).ItemArray = {"Fernando Ramirez", "Spain"}
        tabela.Rows(5).ItemArray = {"Shang Sheng", "China"}
        tabela.Rows(6).ItemArray = {"Reed Kimble", "United Kingdom"}
        tabela.Rows(7).ItemArray = {"John Anthony Olivier", "United States"}
        tabela.Rows(8).ItemArray = {"Marie Claire", "France"}
    End Sub

Este método apenas cria um DataTable com duas colunas :  Nome e Pais e preenche o DataTable - tabela - com dados.

A seguir criamos um DataView a partir da tabela gerada e definimos o datasource do ListBox - lb2 , ordenamos as informações por nome e exibimos o nome o ListBox :

        Dim dv As New DataView(tabela)
        lb2.DataSource = dv
        dv.Sort = "Nome"
        lb2.DisplayMember = "Nome"

Quando o usuário selecionar um país no primeiro ListBox(lb1) desejamos exibir os nomes relacionados ao país no segundo Listbox(lb2).

Para isso basta usar o evento SelectedIndexChanged do primeiro ListBox (lb1) onde usamos o método RowFilter para filtrar o dataview pelo nome do pais selecionado exibindo o resultado no segundo ListBox(lb2) :

Nota:  A propriedade RowFilter  define a expressão usada para filtrar quais linhas serão exibidas em DataView. Para formar um valor de RowFilter , especifique o nome de uma coluna seguido por um operador e um valor para sobre filtragem.

 Private Sub lb1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lb1.SelectedIndexChanged
        DirectCast(lb2.DataSource, DataView).RowFilter = "Pais = '" & lb1.SelectedItem.ToString & "'"
    End Sub

O código do botão - Restaurar  Dados - apenas invoca o método GeraDados() para restaurar as informações:

Private Sub btnRestaurar_Click(sender As Object, e As EventArgs) Handles btnRestaurar.Click
        GeraDados()
End Sub

Rodando o projeto e após preencher os listbox, ao selecionar um país no primeiro ListBox temos os dados relacionados exibidos no segundo conforme figura abaixo:

Eu procurei utilizar uma abordagem bem simples para facilitar o entendimento de quem esta começando agora com o VB .NET.

Pegue o projeto completo aqui :  Vbnet_FiltroListBox.zip

Mas a hora vem, e agora é, em que os verdadeiros adoradores adorarão o Pai em espírito e em verdade; porque o Pai procura a tais que assim o adorem.
Deus é Espírito, e importa que os que o adoram o adorem em espírito e em verdade.

João 4:23,24

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti