VB.NET - Carregando um ListBox e exibindo detalhes


Neste artigo você vai aprender como preencher um listBox com os dados de uma tabela de um banco de dados Access de forma que quando um item for selecionado no listbox seus detalhes serão exibidos em um formulário em caixas de texto.

Na figura abaixo você vê o formulário exibindo o listbox e as caixas de texto para exibir os detalhes:

Controles:formulário - frmListBox

Caixa de Listagem: ListBox
lstNomes

Caixas de texto : TextBox
txtNome.Text
txtSobrenome.Text
txtEndereco.Text
txtCidade.Text
txtEstado.Text
txtCep.Text

Inicie um novo projeto no Visual Studio .NET do tipo Windows Application usando a linguagem VB.NET e no formulário padrão inclua os controles como na figura acima.

Na caixa de ferramentas selecione a guia Data e insira um componente OleDbConnection no projeto , alterando o seu nome para connClientes.

No evento Load do formulário inclua o código abaixo:

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

        ' pega o nome do assembly  (geralmente na pasta bin)
        ' Ex: c:\vbnet\loadListBox\bin\carregaListboxe.exe
        Dim nomeBD As String = Application.ExecutablePath

        'remove o nome do assembly 
        'Ex: c:\vbnet\loadListBox\bin\
        nomeBD = nomeBD.Substring(0, nomeBD.LastIndexOf("\") + 1)

        'se o nome terminar com barra(\) então extrai o nome \bin\
        If nomeBD.EndsWith("\bin\") Then
            'Ex:d:\vbnet\loadListBox\
            nomeBD = nomeBD.Substring(0, nomeBD.Length - 4)
        End If
        'acrescenta o nome do banco de dados
        'ficou assim:
        'Ex: d:\vbnet\loadListBox\bin\cadastro.mdb
        nomeBD &= "Cadastro.mdb"

        ' constroi a string de conexão (pode ser bem mais simples mas deixei como foi gerado)
        Me.connClientes.ConnectionString = _
        "Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;" & _
        "Data Source=""" & nomeBD & """;Mode=Share Deny None;Jet OLEDB:Engine Type=5;" & _
        "Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;" & _
        "persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;" & _
     "Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;" & _
     "Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1"

      'carrega a lista de nomes da tabela CLientes do banco de dados cadastro.mdb usando a rotina
         carregaListBox(lstNomes, "SELECT Nome, Sobrenome FROM Clientes ORDER BY Nome, Sobrenome")
    End Sub

 

Neste código estamos apenas incluindo o nome do banco de dados usado - cadastro.mdb - do caminho da aplicação. O banco de dados esta presente na pasta bin.

Em seguida definimos a string de conexão para o objeto connClientes do formulário (eu peguei esta string da janela de propriedades do objeto mas ela pode ser bem mais simplificada)

Finalmente chamamos a rotina - carregaListBox - passando o nome da caixa de listagem - lstNomes , e uma instrução SQL que seleciona o nome e o sobrenome de cada cliente da tabela Clientes.

A rotina carregaListBox tem o seguinte código :

Private Sub carregaListBox(ByVal lst As ListBox, ByVal query As String)
        'limpa o listbox
        lst.Items.Clear()

        ' abre a conexão
        connClientes.Open()

        ' cria um command Select
        Dim cmd As New OleDb.OleDbCommand(query, connClientes)

        ' Executa a consulta criando um datareader
        Dim dr As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.Default)

        ' exibe o resultado no listbox
        Dim texto As String
        Dim i As Integer
        'percorre o datareader
        Do While dr.Read
            'le o primeiro campo do datareader
            texto = dr.Item(0).ToString
            For i = 1 To dr.FieldCount - 1
                texto &= vbTab & dr.Item(i).ToString
            Next i
            'inclui o texto no listbox
            lst.Items.Add(texto)
        Loop

        ' fecha a conexao
        connClientes.Close()
    End Sub

Como o código já esta comentado podemos dizer que basicamente estamos criando um datareader e preenchendo o listbox com os dados da tabela Clientes.

Neste ponto vale a pena falar um pouco do método ExecuteReader usado na linha de código :

 Dim dr As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.Default)

Este método é um método do objeto OleDbCommand e ele envia o CommandText para o objeto Connection e constrói um OledbDataReader usando os valores de CommandBehavior.

O objeto CommandBehavior fornece uma descrição de resultados de uma consulta e seus efeitos no banco de dados.

Os valores do CommandBehavior são usados pelo método ExecuteReader da interface IDbCommand e qualquer classe derivada.

Abaixo temos os valores com seus significados resumidos:

Membro Descrição Valor
CloseConnection Quando o comando é executado , o objeto Connection associado é fechado quando o objeto DataReader associado for fechado. 32
Default

 

A consulta pode retornar múltiplos resultsets. A execução de uma consulta pode afetar o estado do banco de dados.  ExecuteReader(CommandBehavior.Default) é equivalente a uasr ExecuteReader(). 0
KeyInfo A consulta retorna informação da coluna e da chave primária e é executad sem qualquer bloqueio nas linhas selecionadas. 4
SchemaOnly

 

A consulta retorna informação somente da coluna e não afeta o estado do banco de dados. 2
SequentialAccess

 

Fornece uma forma do DataReader manipular as linhas que contém colunas com valores binários grandes.Ao invés de carregar a linha inteira, ele permite carrgar os dados como um stream. Você pode usar então o método GetBytes ou  o método GetChars para definir a localização do byte para iniciar a operação de leitura e limitar o tamanho do buffer.

Ao usar este membro a leitura deverá ser feita na ordem na qual elas foram retornadas.

16
SingleResult . A consulta retorna somente um resultset. 1
SingleRow A consulta deverá retornar uma única linha e sua execução pode afetar o estado do banco de dados. 8

Lembre-se que enquanto um OleDbDataReader estiver sendo usado , a conexão associado estará ocupada e neste estado nenhuma outra operação poderá ser realizada no objeto OleDbConnection a ser fechá-lo.  Se o OleDbDataReader  for criado com CommandBehavior  usando CloseConnection implica que no fechamento do OleDbDataReader  a conexão será fechada.

Vejamos agora o código do evento SelectedIndexChange que ocorre quando um usuário seleciona um item da caixa de listagem:

Private Sub lstNomes_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles lstNomes.SelectedIndexChanged

        ' obtem o nome selecionado no listbox
        Dim names() As String = lstNomes.Text.Split(CChar(vbTab))

        ' exibe o nome e sobrenome do cliente
        exibeDadosCliente(names(0), names(1))
End Sub

 

Quando isto ocorre iremos obter um array de nomes e chamaremos a rotina exibeDadosCliente que irá exibir os dados na caixa de texto do formulário.

 

A rotina a

 Private Sub exibeDadosCliente(ByVal nome As String, ByVal sobrenome As String)
 
        ' abre a conexao
        connClientes.Open()

        ' cria um command para esta conexao
        Dim cmd As New OleDb.OleDbCommand("SELECT * FROM Clientes WHERE Nome=? AND Sobrenome=?", connClientes)     

        ' Cria uma consulta paremetrizada
        cmd.Parameters.Add(New OleDb.OleDbParameter("Nome", nome))
        cmd.Parameters.Add(New OleDb.OleDbParameter("Sobrenome", sobrenome))

        ' executa a consulta.
        Dim dr As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)

        ' exibe o resultado nas caixas de texto
        If dr.HasRows Then
            dr.Read()
            txtNome.Text = dr.Item("Nome").ToString
            txtSobrenome.Text = dr.Item("Sobrenome").ToString
            txtEndereco.Text = dr.Item("Endereco").ToString
            txtCidade.Text = dr.Item("Cidade").ToString
            txtEstado.Text = dr.Item("Estado").ToString
            txtCep.Text = dr.Item("Cep").ToString
        Else
            'limpa as caixas de texto
            For Each ctl As Control In Me.Controls
                If TypeOf ctl Is TextBox Then ctl.Text = ""
            Next ctl
        End If

        ' fecha a conexao
        connClientes.Close()
    End Sub

 

Neste código observe que usamos uma consulta parametrizada para ser executada retornando uma única linha da tabela (SingleRow).

 

Note também que usamos os método HasRows para verificar se há dados no datareader retornado.

 

Executando o projeto iremos obter:

 

 

Fique a vontade para incrementar o projeto as suas necessidades.

 

Projeto Completo :   lstBox.zip (77 Kb)

Até o próximo artigo VB.NET.

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 ?

Referências:


José Carlos Macoratti