VB .NET - Agenda de Contatos com TreeView (revisitado)
No artigo de hoje é um artigo para iniciantes da linguagem VB .NET e mostra como usar o controle TreeView para exibir dados do Microsoft Access e como selecionar os dados do controle exibindo-os no formulário. |
Esse é um artigo para iniciantes com o objetivo de mostrar com o usar o controle TreeView de forma bem simples com o VB .NET.
Eu já escrevi muitos artigos sobre o componente TreeView, para Visual Basic, para VB .NET e para C#. (veja as referências)
Por isso já vou iniciar mostrando como criar o projeto e usar o controle, sem me ater aos detalhes do controle em si, que podem ser conferidos nas referências no final do artigo.
Nosso objetivo será preencher o controle TreeView com dados da tabela Customers do banco de dados Northwind.mdb simulando uma agenda de contatos.
O usuário poderá carregar os dados e selecionar o nome de um contato para obter seu telefone e mais informações que serão exibidas no formulário do projeto.
Neste projeto estamos incluindo código de acesso a dados no formulário misturando assim a responsabilidade de acessar os dados com a camada de apresentação o que não é uma boa prática.
Podemos justificar essa abordagem em protótipos e pequenos projetos pessoais; para aplicações comerciais nem pensar.
Recursos usados :
Criando o projeto no VS 2013 Express Edition
Abra o VS 2013 Express for Windows desktop e clique em New Project;
A seguir selecione Visual Basic -> Windows Forms Application;
Informe o nome TreeView_BD e clique no botão OK;
No formulário form1.vb vamos incluir os seguintes controles a partir da ToolBox:
1 TreeView - tvDados, ImageList= ImagemList1
4 Labels
4 TextBox - txtNome, txtEndereco, txtCidade e txtpais
2 Buttons - btnCarregar btnEncerrar
2 PictureBox - btnExpande, SizeMode = StretchImage e btnRetrai, SizeMode = StretchImage
1 ImageList - ImagemList1 , Atribuir 3 imagens
Disponha os controles no formulário conforme o leiaute da figura abaixo:
Como vamos acessar um banco de dados Microsoft Access precisamos declarar os seguintes namespaces no formulário:
Imports
System.DataA seguir precisamos definir algumas variáveis que desejamos que sejam visíveis em todo o formulário.
Dim conexaoBD As OleDbConnectionQuando o formulário for apresentando o usuário deverá clicar no botão - Carregar - para preencher o controle TreeView. Inclua o código abaixo no evento Click desse Botão:
Private Sub btnCarregar_Click(sender As Object, e As EventArgs) Handles btnCarregar.Click
Try
'preenche o treeview
CarregaDados()
'tvDados.ExpandAll()
Catch ex As Exception
MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
|
Abaixo vemos o código do método CarregaDados() que acessa o banco de dados Northwind.mdb e a tabela Customers usando uma instrução SQL.
Private Sub CarregaDados()
arquivoBD = "C:\dados\NorthWind.mdb"
Dim MyCon As String = "provider=microsoft.jet.oledb.4.0;Password="""";data source=" & arquivoBD
conexaoBD = New OleDbConnection()
conexaoBD.ConnectionString = MyCon
Dim cmdSelect As OleDbCommand = New OleDbCommand()
Dim datAdp As OleDbDataAdapter = New OleDbDataAdapter()
datSet = New DataSet()
Try
tabelaBD = "Customers"
' Seleciona todos os campos
Dim strSql As String = "SELECT * FROM " + tabelaBD + " ORDER BY ContactName"
cmdSelect.CommandText = strSql
cmdSelect.CommandType = CommandType.Text
conexaoBD.Open() ' abre a conexao
cmdSelect.Connection = conexaoBD
datAdp.SelectCommand = cmdSelect
datAdp.Fill(datSet, tabelaBD) 'preenche o dataste
' Se não existem registros avisa
Dim numeroRegistros As Integer = Me.BindingContext(datSet, tabelaBD).Count
If numeroRegistros = 0 Then
MessageBox.Show("Não existe registro no arquivo !", "Sem dados", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
Else
DefineNoRaiz()
End If
Catch
Throw
Finally
conexaoBD.Close()
End Try
End Sub
|
O código do método DefineNoRaiz a seguir define o nó raiz e atribui a imagem definida no controle ImageList ao Nó.
Private Sub DefineNoRaiz() Try ' define o nó raiz do TreeView: tvDados.Nodes.Add("Agenda Telefones") tvDados.Nodes(0).Tag = "RootDB" tvDados.Nodes(0).ImageIndex = 0 tvDados.Nodes(0).SelectedImageIndex = 0 ' Define os contatos DefineNomeContato() ' Define os telefones dos contatos DefineTelefone() Catch ex As Exception MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
|
O método DefineNomeContato() atribuí ao respectivo nó nome do contato e define a sua tag com o nome do campo (ContactName):
Private Sub DefineNomeContato()
Try
'Define o nome do contato como um nó
numeroItem = datSet.Tables(tabelaBD).Rows.Count
For i As Integer = 0 To numeroItem - 1
tvDados.Nodes(0).Nodes.Add(datSet.Tables(tabelaBD).Rows(i).ItemArray(2).ToString())
tvDados.Nodes(0).Nodes(i).Tag = "ContactName"
tvDados.Nodes(0).Nodes(i).ImageIndex = 1
tvDados.Nodes(0).Nodes(i).SelectedImageIndex = 1
Next
Catch
Throw
End Try
End Sub
|
A rotina DefineTelefone() atribui ao respectivo nó o telefone e define sua tag com o nome do campo da tabela (Phone):
Private Sub DefineTelefone()
Try
' Define o telefone como um nó
For i As Integer = 0 To numeroItem - 1
tvDados.Nodes(0).Nodes(i).Nodes.Add(datSet.Tables(tabelaBD).Rows(i).ItemArray(9).ToString())
tvDados.Nodes(0).Nodes(i).Nodes(0).Tag = "Phone"
tvDados.Nodes(0).Nodes(i).Nodes(0).ImageIndex = 3
tvDados.Nodes(0).Nodes(i).Nodes(0).SelectedImageIndex = 3
Next
Catch
Throw
End Try
End Sub
|
No evento AfterSelect do TreeView, quando o usuário clica no nome (Level=1) então expandimos o nó e localizamos o registro passando o nome do campo definido na tag e o nome selecionado usando o método ExibeRegistros():
Private Sub tvData_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles tvDados.AfterSelect
Try
'se clicou no nome exibe os dados
If e.Node.Level = 1 Then
e.Node.Expand()
ExibeRegistros(tvDados.Nodes(0).Nodes(1).Tag, e.Node.Text)
End If
Catch
Throw
End Try
End Sub
|
O método ExibeRegistros() define um DataView e ordena-o com base no nome do campo recebido localizando a seguir o registro pelo critério informado:
Private Sub ExibeRegistros(ByVal Ordem As String, ByVal criterio As String)
Try
' Usando o DataView para localiar o registro pelo critério
Dim dv As DataView = New DataView(datSet.Tables(tabelaBD))
'ordena
dv.Sort = Ordem
'localiza
Dim i As Integer = dv.Find(criterio)
Me.BindingContext(datSet, tabelaBD).Position = i
'exibe os valores nas caixas de texto
txtEmpresa.Text = datSet.Tables(tabelaBD).Rows(i).ItemArray(1).ToString()
txtEndereco.Text = datSet.Tables(tabelaBD).Rows(i).ItemArray(4).ToString()
txtCidade.Text = datSet.Tables(tabelaBD).Rows(i).ItemArray(5).ToString()
txtPais.Text = datSet.Tables(tabelaBD).Rows(i).ItemArray(8).ToString()
Catch ex As Exception
MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
|
O código do evento Click do controle Picturebox - picExpande - para expandir todos os Nós do TreeView:
Private Sub picExpande_Click(sender
As Object, e As EventArgs) Handles picExpande.Click tvDados.ExpandAll() End Sub |
O código do evento Click do controle Picturebox - picRetrai - para retrair todos os Nós do TreeView:
Private Sub picRetrai_Click(sender As Object, e As EventArgs) Handles picRetrai.Click
tvDados.CollapseAll()
End Sub
|
Executando o projeto e selecionando um nome da agenda teremos o seguinte resultado:
Pegue o projeto completo aqui : TreeView_BD.zip
(Disse Jesus) Não crês
tu que eu estou no Pai, e que o Pai está em mim? As palavras que eu vos digo não
as digo de mim mesmo, mas o Pai, que está em mim, é quem faz as obras.
João 14:10
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 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: