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 ; Obs: É importante sempre conhecer o nó pai para qualquer nó que estamos consultando ou incluindo. |
Algumas características básicas do TreeView:
Cada Item em um TreeView esta 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 desta 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 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: