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:

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.Data
Imports
System.Data.OleDb

A seguir precisamos definir algumas variáveis que desejamos que sejam visíveis em todo o formulário.

Dim conexaoBD As OleDbConnection
Dim arquivoBD As String
Dim
datSet As DataSet
Dim tabelaBD As String
Dim
numeroItem As Integer

Quando 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:


José Carlos Macoratti