VB .NET - Vinculando um DataTable a um TreeView


Volto a falar sobre o controle TreeView, um controle importante e que oferece recursos para disponibilizar uma visualização hierárquica de dados. Tentarei não me repetir apresentando aspectos ainda não abordados sobre este controle.

O controle TreeView permite uma apresentação intuitiva da informação dispostas em nós facilitando a visualização e a seleção da mesma. O exemplo mais conhecido onde este tipo de visualização é usada é o Explorer do Microsoft Windows que exibe informações sobre o sistema operacional:

Para entender como o TreeView funciona temos que saber que:

- Cada nó representa uma informação ;
- Nós filhos estão contidos nos nós pais ;
- O nó raiz contém todos os nós;

Obs: É importante sempre conhecer o nó pai para qualquer nó que estamos consultando ou incluindo.

Algumas características básicas do TreeView:

No VB.NET geralmente usamos o controle TreeView para exibir dados hierárquicos. Podemos fazer isso em tempo de execução ou em tempo de projeto.

Vamos supor que você precisa exibir uma informação que esta no banco de dados em um árvore hierárquica usando o controle TreeView.

Uma situação propícia a este cenário é quando temos duas tabelas relacionadas.

Para este exemplo eu vou usar um banco de dados Access e duas tabelas : Funcionarios e Cargos.

Para criar o banco de dados e as tabelas eu vou usar o aplicativo VISDATA que vem junto com o Visual Basic 5 ou 6. (túnel do tempo...). O aplicativo pode ser executado a partir do IDE do VB ou como um programa a parte.

Nota: Veja nas referências como usar o VISDATA para criar o banco de dados MSAccess.(.mdb)

Veja abaixo o banco de dados Empresa.mdb e as tabelas Funcionarios e Cargos exibindo a sua estrutura:

Perceba que temos a seguinte hierarquia no relacionamento entre as tabelas:

--- Cargo
        |------- Funcionario

Nosso objetivo será obter os dados das duas tabelas e exibir em um controle TreeView.

Uma das muitas formas de resolver este problema é usar o objeto DataTable criando um datatable para cada uma das tabelas e verificando o relacionamento e incluindo Nós pais e nós filhos no TreeView via código.

Abra o Visual Studio 2010 beta 2 ou o VS 2008 ou o VB 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application;

No formulário padrão form1.vb inclua um controle TreeView (tvEmpresa) e um botão de comando btnPreencherTV conforme o leiaute abaixo:

Agora defina o namespace para usar o banco de dados Microsoft Access:

Imports System.Data.OleDb

No evento Click do botão de comando vamos fazer a chamada da rotina para preencher o controle TreeView:

Private Sub btnPreencherTV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreencherTV.Click
        vinculaDadosTreeView()
    End Sub

A seguir defina o código da rotina vinculaDadosTreeView() conforme abaixo:

Sub vinculaDadosTreeView()
        Dim pkp(0), pke(0) As DataColumn
        Dim dtbCargos As New DataTable
        Dim dtbFuncionarios As New DataTable

        Dim strconn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Empresa.mdb"
        Dim conn As OleDbConnection
        Dim da As OleDbDataAdapter

        Dim i As Integer
        Dim j As Integer

        Try
            'inicia a conexão
            conn = New OleDbConnection(strconn)

            ' Vincula os cargos do DataTable dtbCargos
            da = New OleDbDataAdapter("Select * from Cargos", conn)

            'limpa e preenche o datatable e define a chave primaria
            dtbCargos.Clear()
            da.Fill(dtbCargos)
            pke(0) = dtbCargos.Columns("cargoid")
            dtbCargos.PrimaryKey = pke

            ' Vincula os funcionarios do DataTable dtbFuncionarios
            da = New OleDbDataAdapter("Select * from Funcionarios", conn)
            dtbFuncionarios.Clear()
            da.Fill(dtbFuncionarios)
            pke(0) = dtbFuncionarios.Columns("id")
            dtbFuncionarios.PrimaryKey = pke

            'fecha a conexao
            conn.Close()

            ' percorre a posição do dtbCargos
            For i = 0 To dtbCargos.Rows.Count - 1
                'Inclui um No pai
                tvEmpresa.Nodes.Add(dtbCargos.Rows(i).Item("cargo"))
                ' percorre o datatable dtbFuncionarios
                For j = 0 To dtbFuncionarios.Rows.Count - 1
                    ' Verifica se o funcionario pertence ao cargo
                    If dtbCargos.Rows(i).Item("cargoid") = dtbFuncionarios.Rows(j).Item("cargoid") Then
                        'Inclui o funcionario no Nó pai
                        tvEmpresa.Nodes(i).Nodes.Add(dtbFuncionarios.Rows(j).Item("Nome"))
                    End If
                Next
            Next
        Catch ex As Exception
            MsgBox("Erro : " & ex.Message)
        End Try
    End Sub

Executando o projeto iremos obter:

Com isso vimos uma forma de representar os dados hierarquicamente usando o TreeView. Nem sempre o cenário será tão amigável mas para estes casos vimos que o caminho é tranqüilo usando os recursos do VB .NET.

Pegue o projeto completo aqui :

Eu sei é apenas VB .NET, mas eu gosto...

Referências:

  • VB .NET - Usando o controle TreeView

  • VB. NET - Herança - criando controles herdados

  • Usando TreeView na Pratica II

  • VB - Exibindo tabelas e registros em um conntrole TreeView

  • Usando o controle TreeView III

  • Lendo um arquivo XML em um TreeView

  • TreeView - Arrastar e Soltar (Drag and Drop)

  • VB.NET - 'Espiando' o sistema de arquivos

  • Criar banco de dados via Código - Access , SQL Server

  • Tabelas: Trabalhando com tabelas (Access).

  • Criando um Banco de dados com o VisData

  • Criando banco de dados e tabelas com o Access


  • José Carlos Macoratti