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 Caixas de texto : TextBox |
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.
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET