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:
  • name = Text1
  • BorderStyle = 0 - none
  • BackColor = &H80000004&
  • Appearance = 0 - Flat

 

  • name = trvData
  • Appearance = 0 -ccFlat
  • BorderStyle = 0 - None
  • FullRowSelect = True

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:


José Carlos Macoratti