VB - Exibindo tabelas e registros no controle TreeView
O controle TreeView já deve ser um velho conhecido , mas para quem esta chegando agora , vou apresentá-lo: leia os artigos abaixo para ter uma visão geral deste importante controle de exibição de dados.
Você pode usar o TreeView em uma infinidade de aplicações. Neste artigo vou mostrar como realizar uma tarefa básica : carregar e exibir os nomes das tabelas de um banco de dados e os eus registros.
Vou usar neste exemplo o banco de dados Access Teste1.mdb que possui as seguintes tabelas: Artigos , Clientes e Produtos.
O projeto deve funcionar assim :
Inicie um novo projeto EXE no VB e no formulário padrão insira um controle TreeView(trvData) e uma caixa de texto - TextBox(TextBox1) - conforme figura abaixo:
Configure o TextBox assim : | Configure o TreeView assim: |
|
|
Quando o formulário do projeto for carregado (Load) , irei criar um conexão com o banco de dados Teste1.mdb e listar o nome de suas tabelas.
A rotina ListaTabelas que faz este serviço utiliza o método OpenSchema do objeto Connection (ADO) para listar as tabelas.Veja o código abaixo: (Para saber mais sobre como usar o método OpenSchema leia o artigo : ADO - Obtendo informações sobre a fonte dos dados)
Na seção - General Declarations do formulário inclua o código que define a string de conexão e a torna visível para todo o formulário.
Option Explicit ' a conexao com o banco de dados Private m_Conn As ADODB.Connection |
1- O código do evento Load do formulário - form1.
Private Sub Form_Load() Dim Arq_DB As String ' Pega o nome do banco de dados Arq_DB = "c:\teste\teste1.mdb" ' Abre a conexao com o banco de dados Set m_Conn = New ADODB.Connection m_Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Arq_DB & ";" & "Persist Security Info=False" m_Conn.Open ' Carrega os nomes das tabelas para o banco de dados ListaTabelas End Sub |
2- O código da rotina ListaTabelas que exibe o nome das tabelas do banco de dados:
'lista as tabelas do banco de dados Private Sub ListaTabelas() Dim rs As ADODB.Recordset Dim table_node As Node ' Limpa o TreeView. trvData.Nodes.Clear ' Obtem os nomes das tabelas usando o OpenSchema ' O parametro final no array é "Table" para indicar que queremos uma lista de tabelas Set rs = m_Conn.OpenSchema(adSchemaTables,Array(Empty, Empty, Empty, "Table")) Do While Not rs.EOF Set table_node = trvData.Nodes.Add(, , , rs!TABLE_NAME) table_node.Tag = "Tabela" rs.MoveNext Loop rs.Close End Sub |
Teremos o seguinte resultado exibido no formulário:
Agora quando o usuário clicar em uma tabela o programa irá chamar a rotina carregaRegistros para exibir os registros da tabela.(Eu estou concatenando todos os registros em uma string chamada : texto_registro.)
Se os registros da tabela já tiverem sidos exibidos a rotina não faz nada se não ela os exibe. Como eu sei quando isto ocorre ? Simples !! eu utilizo a propriedade Tag do Treeview para armazenar a string "Tabela" quando estiver exibindo a tabela ou a string "Registro" quando os registros forem exibidos. Desta forma basta examinar esta propriedade usando o evento para saber o que esta carregado.
1- A seguir a rotina que verifica o Nó para saber se os registros da tabela já foram exibidos:
Private Sub trvData_NodeClick(ByVal Node As MSComctlLib.Node) ' Ve qual tipo de Nó (Registro ou Tabela) Select Case Node.Tag Case "Tabela" ' Carrega os registros da tabela carregaRegistros Node Case "Registro" 'exibe o registro selecionado na caixa de texto Text1.Text = Node.Text End Select End Sub |
2- a rotina carregaRegistros que exibe os registros da tabela.
' lista os registors da tabela Private Sub carregaRegistros(ByVal table_node As Node) Dim rs As ADODB.Recordset Dim i As Integer Dim texto_registro As String Dim no_registro As Node ' se os registros da tabela foram carregados não faz nada If table_node.Children > 0 Then Exit Sub ' Pega os registros da tabela Set rs = m_Conn.Execute( "SELECT * FROM " & table_node.Text, , adCmdText) Do Until rs.EOF ' constroi a string do registro texto_registro = "" For i = 0 To rs.Fields.Count - 1 texto_registro = texto_registro & ", " & rs.Fields.Item(i) Next i texto_registro = Mid$(texto_registro, 2) ' Inclui o registro no Nó Set no_registro = trvData.Nodes.Add(table_node, tvwChild, , texto_registro) no_registro.Tag = "Registro" no_registro.EnsureVisible ' vai para o proximo registro rs.MoveNext Loop rs.Close End Sub |
Ao clicar em uma tabela os registros serão exibidos conforme a figura abaixo:
Não esqueça de encerrar a conexão ao descarregar o formulário:
Private Sub Form_Unload(Cancel As Integer) m_Conn.Close End Sub |
Se você quiser exibir todos os registros de uma tabela sem concatenar os campos em uma string altere o código do laço Do/Loop na rotina carregaRegistros conforme abaixo. (Ao lado a figura exibindo o resultado)
Do Until rs.EOF ' constroi a string do registro texto_registro = "" For i = 0 To rs.Fields.Count - 1 texto_registro = "" & rs.Fields.Item(i)
Set no_registro = trvData.Nodes.Add(tabela_no, tvwChild, , texto_registro)
Next i texto_registro = Mid$(texto_registro, 2) ' Inclui o registro no no 'Set no_registro = trvData.Nodes.Add(tabela_no, tvwChild, , texto_registro)
no_registro.Tag = "Registro" no_registro.EnsureVisible ' vai para o proximo registro rs.MoveNext Loop |
Você pode incluir mais funcionalidades no projeto. Eu , vou ficando por aqui...
Até o próximo artigo VB
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#