O TreeView é um controle importante, que oferece recursos para
disponibilizar uma visualização hierárquica de dados. 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 esse 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 estejamos
consultando ou incluindo.
Algumas
características do TreeView:
- Cada Item em um TreeView está
encapsulado dentro de um objeto TreeNode; - Cada TreeNode pode ter zero, um ou
muitos nós filhos; - A propriedade Nodes do
treeview representa a coleção de objetos TreeNode
que se relacionam com o nó raiz ou o nó superior na
hierarquia; - Cada Nó possui sua própria
coleção Nodes que contém todos os Nós filhos; - Você pode interagir via código
através de cada uma destas coleções; - Você pode selecionar somente um
único Nó por vez; - Você pode selecionar um Nó clicando
nele com o mouse ou usando o teclado; - Para selecionar um Nó via código,
definimos a propriedade TreeView.SelectedNode e o
Nó atualmente selecionado pode ser obtido pelo valor
dessa mesma propriedade; - Use a propriedade FullPath do
Nó selecionado para determinar a hierarquia completa
para o Nó.
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 está 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 à parte.
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
esse 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 esses casos, vimos
que o caminho é tranqüilo usando os recursos do VB .NET.
Eu sei, é apenas VB .NET, mas eu
gosto…