VB .NET - Usando o controle TreeView

 

O componente TreeView permite criar uma interface intuitiva e consistente com o usuário e neste artigo eu vou procurar mostrar como usar o componente TreeView no VB.NET. Vamos mostrar como usar o controle TreeView para exibir os dados das tabelas Fornecedores e Produtos do  banco de dados Northwind.mdb usando a nova classe de acesso a dados : ADO.NET.

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic Projects
  2. Templates : Windows Application
  3. Name : TreeView1
  4. Location : c:\vbnet\TreeView1

2- No formulário padrão - form1.vb - vamos inserir os seguintes componentes : TreeView , Button , ImageList . Conforme layout abaixo :

- O controle TreeView pode exibir ícones próximo a cada nó.Os ícones são posicionados no lado esquerdo do texto do nó. Para exibir os ícones devemos associar o controle TreeView a um controle ImageList.

- Para fazer a vinculação do ImageList ao TreeView defina a propriedade ImageList do controle TreeView para um controle ImageList existente. Podemos fazer isto via janela de propriedades ou via código assim :

       TreeView1.ImageList = ImageList1

- Vamos usar o controle ImageList para exibir os ícones ao lado de cada nó no controle TreeView

 

- O controle ImageList irá conter as imagens usadas no controle TreeView ; para isto devemos definir quais imagens desejamos usar através da propriedade Images do controle ImageList.

Clique  sobre o controle ImageList e na janela propriedades clique em Images ...

1 - Para incluir imagens clique no botão - Add e selecione as imagens desejadas

- Quando encerrar basta clicar no botão OK.

2- Podemos fazer esta atribuição via código , neste caso , devemos definir as propriedades : ImageIndex e SelectedImageIndex  do nó , onde :

  • ImageIndex - determina a imagem a ser exibida para o estado expandido e normal do nó
  • SelectedImageIndex - determina a imagem a ser exibida para o estado selecionado do nó.

Exemplo:

  1. TreeView1.SelectedNode.ImageIndex = 0
    TreeView1.SelectedNode.SelectedImageIndex = 1
    

Obs:Podemos exibir também caixas de verificação (checkBox) próximo aos nós ; para isto basta definir como True a propriedade CheckBoxes.

 

Com o controle ImageList configurado e vinculado ao controle TreeView podemos seguir em frente e implementar as funcionalidades do nosso projeto , para isto vamos usar os eventos : AfterCollapse e AfterExpand  e os métodos BeginUpdate e EndUpdate do controle TreeView.

 

  1. AfterCollapse - Ocorre quando um nó do controle é retraído

  2. AfterExpand - Ocorre quando um nó do controle é expandido

  1. BeginUpdate - impede a atualização do controle TreeView
  2. EndUpdate - permite a atualização do controle TreeView

 

Vamos usar também uma conexão ADO.NET com a base de dados Northwind.mdb usando um OleDbDataReader .

 

- No evento Click do botão de comando  - btnPrencheTreeView - vamos associar o código que declara as variáveis , cria a conexão com o banco de dados e define a instrução SQL que exibirá os registros das tabelas Fornecedores e Produtos.

 

Private Sub btnPreencheTreeView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreencheTreeView.Click

 

Dim conexao As String

Dim cnBDNorthwind As OleDb.OleDbConnection

Dim sql As String

 

conexao = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\teste\Northwind.mdb"

cnBDNorthwind = New OleDb.OleDbConnection(conexao)

 

Try

    cnBDNorthwind.Open()

Catch erro As System.Exception

   MessageBox.Show(erro.GetBaseException.ToString, "Erro de conexão ao banco de dados", MessageBoxButtons.OK)

End Try

 

TreeView1.BeginUpdate()

TreeView1.Nodes.Clear()

 

sql = "SELECT Fornecedores.CódigoDoFornecedor, Fornecedores.NomeDaEmpresa, Produtos.CódigoDoProduto, Produtos.NomeDoProduto"

sql = sql & " FROM Fornecedores"

sql = sql & " INNER JOIN Produtos ON Fornecedores.CódigoDoFornecedor = Produtos.CódigoDoFornecedor"

sql = sql & " ORDER BY Fornecedores.NomeDaEmpresa"

 

Dim cmdFornecedores As New OleDb.OleDbCommand(sql, cnBDNorthwind)

Dim drFornecedores As OleDb.OleDbDataReader

 

drFornecedores = cmdFornecedores.ExecuteReader

 

Dim noFornecedor As TreeNode

Dim noProduto As TreeNode

Dim sgnCodFornecedor As Single = 0

Dim sgnCodProduto As Single = 0

 

While drFornecedores.Read

 

   If Not drFornecedores("CódigoDoFornecedor") = sgnCodFornecedor Then

       noFornecedor = New TreeNode()

           With noFornecedor

            .ImageIndex = 0

            .Tag = "Fornecedor"

            .Text = drFornecedores("NomeDaEmpresa")

          End With

      TreeView1.Nodes.Add(noFornecedor)

      sgnCodFornecedor = drFornecedores("CódigoDoFornecedor")

    End If

 

  If Not drFornecedores("CódigoDoProduto") = sgnCodProduto Then

        noProduto = New TreeNode()

             With noProduto

             .ImageIndex = 1

             .Tag = "Produto"

             .Text = drFornecedores("NomeDoProduto")

           End With

       TreeView1.Nodes(noFornecedor.Index).Nodes.Add(noProduto)

       sgnCodProduto = drFornecedores("CódigoDoProduto")

   End If

End While

 

drFornecedores.Close()

TreeView1.EndUpdate()

cnBDNorthwind.Close()

 

End Sub

 

Como funciona ?

 

1- A string de conexão usa o provedor OLEDB (lembra  da ADO ?) e deve informar o caminho e nome do banco de dados

 

conexao = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\teste\Northwind.mdb"

 

2- A instrução SQL é quem vai permitir que os dados sejam extraídos das tabelas e estejam relacionados

 

sql = "SELECT Fornecedores.CódigoDoFornecedor, Fornecedores.NomeDaEmpresa, Produtos.CódigoDoProduto, Produtos.NomeDoProduto"

sql = sql & " FROM Fornecedores"

sql = sql & " INNER JOIN Produtos ON Fornecedores.CódigoDoFornecedor = Produtos.CódigoDoFornecedor"

sql = sql & " ORDER BY Fornecedores.NomeDaEmpresa"

 

3- Definimos e criamos um objeto OleDbDataReader passando a instrução SQL e a conexão com o banco de dados

 

Dim cmdFornecedores As New OleDb.OleDbCommand(sql, cnBDNorthwind)

Dim drFornecedores As OleDb.OleDbDataReader

drFornecedores = cmdFornecedores.ExecuteReader

 

 

O objeto OleDbDataReader fornece uma maneira de ler um fluxo de dados somente leitura de um fonte de dados. Para criar um OleDbDataReader invocamos o método ExecuteReader do objeto OleDbCommand. Enquanto o OleDbDataReader estiver em uso o objeto   OleDbConnection associado esta sendo usado servindo o  OleDbDataReader e nenhuma operação pode ser realizada em  OleDbConnection ; você só pode fechá-lo.(Close).

 

4-  Depois percorremos o objeto OleDbDataReader e criamos os nós com o nome dos fornecedores :

 

 If Not drFornecedores("CódigoDoFornecedor") = sgnCodFornecedor Then

       noFornecedor = New TreeNode()

           With noFornecedor

            .ImageIndex = 0

            .Tag = "Fornecedor"

            .Text = drFornecedores("NomeDaEmpresa")

          End With

      TreeView1.Nodes.Add(noFornecedor)

      sgnCodFornecedor = drFornecedores("CódigoDoFornecedor")

    End If

 

5-  A seguir percorremos o objeto OleDbDataReader e criamos os nós dos produtos relacionados a cada fornecedor:

 

If Not drFornecedores("CódigoDoProduto") = sgnCodProduto Then

  noProduto = New TreeNode()

   With noProduto

    .ImageIndex = 1

    .Tag = "Produto"

    .Text = drFornecedores("NomeDoProduto")

   End With

TreeView1.Nodes(noFornecedor.Index).Nodes.Add(noProduto)

sgnCodProduto = drFornecedores("CódigoDoProduto")

End If

 

Para terminar vamos mostrar o código associado aos eventos : AfterCollapse e AfterExpand . Como no nosso projeto temos somente um nível na árvore de nós o código relacionado a estes eventos é apenas ilustrativo. Se tivéssemos mais níveis poderíamos associar outros ícones a cada estado e fazer o tratamento usando os eventos citados.

 

Private Sub TreeView1_AfterCollapse(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCollapse

   Select Case e.Node.Tag

        Case "Fornecedor"

         e.Node.ImageIndex = 0

       Case "Produto"

        e.Node.ImageIndex = 1

    End Select

End Sub


 

Private Sub TreeView1_AfterExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterExpand

    Select Case e.Node.Tag

        Case "Fornecedor"

         e.Node.ImageIndex = 0

        Case "Produto"

         e.Node.ImageIndex = 1

     End Select

End Sub

 

Executando o projeto teremos a seguinte janela :

 

 

Neste artigo apenas estou apenas exibindo os dados usando o controle TreeView.

 

Aguardem mais artigos sobre o controle TreeView onde iremos mostrar como incluir , alterar e excluir dados usando esta interface.

 

Até mais ...

 

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti