Access
 sql >> Base de Dados >  >> RDS >> Access

Marca de seleção de controle de exibição de árvore Adicionar nós de exclusão

Introdução.


Neste episódio do Tutorial de controle de visualização em árvore, aprenderemos como Adicionar/Excluir Nós. A posição do item candidato Add/Delete será marcada, onde queremos Add() o novo Node ou para Remover() o nó marcado. A adição do Node pode estar no mesmo nível do Node marcado ou como um Node Filho.

As Sessões do Tutorial de Controle TreeView até agora.
  1. Tutorial de controle do Microsoft TreeView
  2. Criando menu de acesso com controle TreeView
  3. Atribuindo imagens ao controle TreeView
  4. Atribuindo imagens ao TreeView Control-2

A exibição normal do controle de exibição da árvore de demonstração no formulário do MS-Access, com outros controles, é fornecida abaixo.

A tabela de dados para a demonstração do controle TreeView.


A Tabela com o nome Amostra, usamos na primeira Sessão Tutorial, vamos colocar em uso aqui também. É uma pequena tabela com registros de banco de dados Access, estrutura de controles de tabela, formulário e relatório, organizados em ordem hierárquica e de fácil compreensão.

O ID coluna (Exibição em árvore Chave ) é um campo AutoNumeração.

Novos visitantes são atualizados para esta sessão do tutorial.


Se você não passou pela primeira sessão do tutorial, você pode baixar o banco de dados de demonstração da segunda página da sessão:Criando menu de acesso com controle de visualização em árvore. Há uma tabela nesse banco de dados com o nome:amostra e formulário frmSample . Você pode importá-los para seu banco de dados atual. Existe outro formulário com o nome frmMenu lá e você pode copiar os botões de comando Expand All, Recolher tudo, e seus procedimentos de evento de clique de botão de comando em frmMenu para o frmSample Módulo de código para continuar com esta sessão.

Como mencionei anteriormente podemos compartilhar o Controle ImageList, com as Imagens enviadas para outros Projetos, faremos uma cópia do Controle ImageList da última Sessão do Tutorial e traremos aqui, com todas as imagens enviadas, e usaremos no Nós de controle de visualização em árvore em frmSample .

Importando controle ImageList com imagens.


Você pode trazer o controle ImageList que você já possui, com imagens carregadas em outro banco de dados, das seguintes maneiras:

  1. Importe o formulário com o controle ImageList para o banco de dados ativo, do banco de dados onde você tem o controle ImageList com imagens carregadas manualmente. Copie e cole o controle ImageList no formulário, onde desejar.





  2. Ou copie o controle ImageList para a área de transferência, do banco de dados, onde você o possui, primeiro. Se você baixou o banco de dados de demonstração da sessão de tutorial anterior, então você já tem o controle ImageList com imagens carregadas. Feche o banco de dados depois de copiar o controle ImageList para a área de transferência.

  3. Abra o banco de dados de destino e abra o formulário onde deseja o controle ImageList e cole-o no formulário.

    Com as seguintes linhas de código no CreateTreeView() Sub-rotina você pode passar a Referência de Objeto ImageList para o Tree View Control.
    Dim tv As MSComctlLib.TreeView
    Dim ImgList As MSComctlLib.ImageList
    
    Set tv = Me.TreeView0.Object
    tv.Nodes.Clear
    
    Set ImgList = Me.ImageList0.Object
    tv.ImageList = ImgList 





Altere os Nomes de Objetos destacados no Código, se forem diferentes no Formulário.

Depois disso, você pode adicionar os nomes de chave de imagem no TreeView Nodes.Add() os dois últimos parâmetros do método.

Esses exercícios já fizemos nas sessões anteriores. Para lembrá-lo de que estamos usando o controle de exibição de tabela e árvore que criamos na primeira sessão do tutorial e implementamos com as alterações explicadas acima.

Exibindo os valores de propriedade dos nós marcados.


A chave do nó selecionado , Chave principal, e Texto As propriedades são exibidas nos TextBoxes no lado direito do Tree View Control. A Caixa de seleção com a legenda:Nó filho, o Excluir Nó, e Adicionar nó Os botões de comando são novas adições ao formulário. Suas funções serão explicadas em breve.

Exibindo caixas de seleção no controle TreeView.


Normalmente, a caixa de seleção não é exibida no controle TreeView, a menos que habilitemos uma propriedade na folha de propriedades do controle Tree View. Ele tem apenas algumas funcionalidades limitadas aqui. Tudo o que vamos fazer aqui também pode ser feito sem a caixa de seleção.

Uma melhor abordagem para a utilização de CheckBoxes pode ser, como a elaboração de um Relatório sobre a localização de filiais selecionadas dos Negócios da Empresa, com base em escolhas aleatórias de filiais selecionáveis ​​pelo usuário, a partir do Menu de Acesso ao Projeto.

Aqui, o objetivo é dar a conhecer esse recurso e executar uma demonstração de seu uso.
  1. Abra o formulário com o controle TreeView no modo Design.
  2. Clique com o botão direito do mouse no controle TreeView, realce o Objeto TreeCtrl , selecione as Propriedades opção para exibir a folha de propriedades.
  3. Coloque uma marca de verificação nas Caixas de seleção opção no controle de propriedades como mostrado na imagem abaixo.

A imagem de demonstração TreeView fornecida na parte superior, Detalhes.


Vamos ver o que temos no formulário de demonstração frmSample apresentado no topo desta página. O controle de exibição em árvore e os dois botões de comando superiores, Expandir tudo e Recolher tudo, on Click Expande ou Recolhe os Nós e vimos suas funções no último episódio.

No lado direito existem três TextBoxes, abaixo do título Label:Valores da propriedade , para exibir a Chave do nó marcado , ParentKey, e Texto Valores.

A exclusão de nó O botão de comando remove o nó marcado ou o nó e seus nós filhos.

Antes de selecionar o Botão de comando Adicionar nó , o Texto O valor da propriedade deve ser editado para substituir pelo novo valor do texto para o novo nó.

Acima de Adicionar nó Botão de comando, há uma caixa de seleção com o rótulo Nó filho. O Adicionar nó e Nó filho Check-Box trabalham juntos para definir a Regra, onde o novo Node deve aparecer.

Compreendendo a ação Adicionar nó.


Suponha que você queira adicionar um novo Node para Hyperlink campo em Campos tipo de dados de grupo (ou Nó pai) Lista. Veja a imagem de demonstração fornecida no topo desta página, onde marquei o Campo de data Node, entre outros Child-Nodes. As folhas de propriedades do lado direito mostram sua chave:X15 , ParentKey:X4 &Texto:Campo de data Descrição.

Altere o texto:Campo de data para hiperlink na caixa de texto de exibição da propriedade e clique em Adicionar nó Botão de comando. A saída será como mostrado abaixo:

Se você marcar os Campos item Node pai e coloque uma marca de seleção no Child-Node opção, acima da opção Adicionar nó Botão de comando, você obterá o mesmo resultado.

Em vez disso, se você mantiver a marca de seleção Nó no Campo de data e defina a marca de seleção no Child-Node opção acima de Adicionar nó Botão de comando, você obterá o resultado conforme mostrado abaixo.

O nó filho será criado sob o nó marcado.

As ações Add Node precisam primeiro criar um novo registro na tabela subjacente.

Um novo registro é criado na Amostra Tabela, com o novo Texto:HyperLink e ParentID Valores. O Campo AutoNumber gera um novo Number e nós o recuperamos e o utilizamos como Key-Value para o Node.

O código VBA da sub-rotina Add Node é fornecido abaixo:
Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = Trim(Me![TxtKey])
lngKey = Val(Mid(strKey, 2))

strParentKey = Trim(Me![TxtParent])
lngParentkey = IIf(Len(strParentKey) > 0, Val(Mid(strParentKey, 2)), 0)

strText = Trim(Me![Text])

'Read child Node Option setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub

Vamos examinar o código VBA. Após as declarações de variáveis ​​locais, os nós TreeView são verificados quanto a marcas de seleção e recebem uma contagem de itens marcados. Se os nós marcados forem mais de um, ele mostrará uma mensagem e abortará o programa.

Observação: Em vez de marcar, podemos clicar diretamente em um nó para selecioná-lo. Em ambos os casos, o Nó Verificado/Clicado é passado como parâmetro para o Procedimento do Evento. A marcação é boa quando você precisa selecionar mais de um item de um menu de projeto, por exemplo:para a seleção de um conjunto diferente de dados para um relatório específico, etc.

Os valores de propriedade do nó verificados são lidos dos controles de formulário em strKey , strParentKey, e strText. Os valores numéricos ID, ParentID são extraídos e salvos em lngKey e lngParentKey Variáveis ​​para uso em SQL String.

Em seguida, o Nó filho O valor da caixa de seleção é salvo em ChildFlag Variável.

Três conjuntos diferentes de SQL Strings são criados com base no Node selecionado e no Child-Node Opção de caixa de seleção acima do botão de comando Adicionar nó.
  1. Se ParentID O valor da propriedade no formulário está vazio e o Nó filho a caixa de seleção não estiver marcada, um novo registro no nível raiz será criado porque o usuário marcou um nó no nível raiz.
  2. Se ParentID Valor da propriedade>=0 e Nó filho a caixa de seleção está marcada (marcada ) então um novo registro é criado como um Child-Node para o Check-Marked Node. A Chave do nó marcado (ID) é usado como ParentID no novo registro para o novo nó.
  3. Se ParentID Valor >=0 e Nó filho opção de caixa de seleção não selecionada (não marcada ), o novo registro é criado para o novo nó, no mesmo nível do nó marcado.

O intFlag A variável é definida com um dos três valores:1,2 ou 3, dependendo da execução do SQL, como indicação do tipo de Node a ser criado no Tree View Control.

Em seguida, com base na seleção de opções, o SQL é executado para criar um novo registro na amostra Table, com um novo valor de campo de ID AutoNumeração.

Em seguida, o DMax() A função retorna o ID de registro exclusivo como valor-chave para o novo nó.

Com base na opção de tipo de nó (1,2 ou 3), o nó é criado no controle de exibição de árvore.

O conteúdo da caixa de texto de exibição de propriedade é apagado.



Excluindo Nó ou Nó com Filhos.


O Excluir nó A opção é muito mais fácil do que o exercício anterior. Simplesmente exclui o nó marcado e seus filhos, se presentes, do controle de exibição em árvore. Os registros relacionados também são excluídos da tabela.

O código VBA para remoção de nós é fornecido abaixo:
Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
            Do Until tmpnode.Children = 0
                nodId = Val(Mid(tmpnode.Child.Key, 2))
        'Delete Child Node
                tv.Nodes.Remove tmpnode.Child.Index
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End If

        nodId = Val(Mid(tmpnode.Key, 2))
    'Delete Parent
       tv.Nodes.Remove tmpnode.Key
       tv.Refresh
    'Delete Marked Record
        strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
        db.Execute strSql
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

Após as declarações de variáveis ​​locais, o For Each . . . Próximo Loop faz uma contagem de nós com marcas de seleção. Se for encontrado mais de um item marcado, uma mensagem será exibida e o programa será abortado.

Se houver apenas um item marcado, a verificação de validação da segunda etapa procura a presença de nós filhos do nó selecionado. Se os nós filhos forem encontrados, uma mensagem será exibida nesse efeito. O usuário precisa reconfirmar sua intenção de excluir primeiro os nós filhos e depois o nó pai marcado.

Observação: Os usuários são aconselhados a excluir primeiro o nível mais profundo de nós filho(s) ou todos os nós filhos de nível mais profundo com seu nó pai imediato, marcando apenas o nó pai, não marcando o nó avô. Limitar a regra de exclusão nesse nível manterá o Código simples e fácil de entender. Violar esta regra pode deixar alguns nós órfãos e acabar com erros quando a visualização em árvore abrir na próxima vez .

Os nós filhos são removidos um a um e os registros correspondentes na tabela também são excluídos, um após o outro. Em seguida, exclui o registro pai marcado.

Se o Nó marcado não tiver Nó(s) filho(s), ele será excluído imediatamente após as verificações de validação e o registro da tabela correspondente também será excluído.

O conteúdo da caixa de texto de exibição de propriedade no formulário é desmarcado.



O código VBA do módulo de classe completo do formulário frmSample.


A seguir está o código VBA completo em frmSample 's Class Module, com outras pequenas sub-rotinas para expandir Nodes recolhíveis, TreeView0_NodeCheck Procedimento de evento, cmdExit Evento de clique do botão de comando, Form_Load() Procedimentos e CreateTreeView() Sub-rotina:
Option Compare Database
Option Explicit

Dim tv As MSComctlLib.TreeView
Dim ImgList As MSComctlLib.ImageList
Const KeyPrfx As String = "X"

Private Sub cmdAdd_Click()
Dim strKey As String
Dim lngKey As Long
Dim strParentKey As String
Dim lngParentkey As Long
Dim strText As String
Dim lngID As Long
Dim strIDKey As String

Dim childflag As Integer
Dim db As DAO.Database
Dim strSql As String
Dim intflag As Integer
Dim tmpnode As MSComctlLib.Node

Dim i As Integer
i = 0
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
       tmpnode.Selected = True
        i = i + 1
    End If
Next
If i > 1 Then
      MsgBox "Selected Nodes: " & i & vbCr & "Select only One Node to mark Addition.", vbCritical, "cmdAdd()"
    Exit Sub
End If

'Read Property Values from Form
strKey = Trim(Me![TxtKey])
lngKey = Val(Mid(strKey, 2))

strParentKey = Trim(Me![TxtParent])
lngParentkey = IIf(Len(strParentKey) > 0, Val(Mid(strParentKey, 2)), 0)

strText = Trim(Me![Text])

'Read child Node Option setting
childflag = Nz(Me.ChkChild.Value, 0)

intflag = 0

strSql = "INSERT INTO Sample ([Desc], [ParentID] ) "
If lngParentkey = 0 And childflag = 0 Then
    'Add Root-level Node, ParentKey is Blank
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & " "
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 1
ElseIf (lngParentkey >= 0) And (childflag = True) Then

    'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngKey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 2
ElseIf (lngParentkey >= 0) And (childflag = False) Then
    'Inserts Node at the check-marked level, Add item under the same ParentKey
    strSql = strSql & "SELECT '" & strText & "' AS [Desc], '" & lngParentkey
    strSql = strSql & "' AS ParentID FROM Sample WHERE ((Sample.ID = 1));"
        intflag = 3
End If

Set db = CurrentDb
db.Execute strSql

'Get newly created autonumber to use as Key
lngID = DMax("ID", "Sample")
strIDKey = KeyPrfx & CStr(lngID)

On Error GoTo IdxOutofBound

Select Case intflag
    Case 1
        'Add Root-level Node, ParentKey is Blank
        tv.Nodes.Add , , strIDKey, strText, "folder_close", "folder_open"
    Case 2
        'Inserts a child Node to the Check-marked Node, here Key value used as ParentKey
        tv.Nodes.Add strKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
    Case 3
        'Inserts Node at the check-marked level, Add item under the same ParentKey
        tv.Nodes.Add strParentKey, tvwChild, strIDKey, strText, "left_arrow", "right_arrow"
End Select
tv.Refresh

    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With

Set db = Nothing
cmdExpand_Click
 
cmdAdd_Click_Exit:
Exit Sub

IdxOutofBound:
    CreateTreeView
Resume cmdAdd_Click_Exit
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
Dim nodId As Long, nodParent As Long
Dim strSql As String
Dim db As DAO.Database
Dim j As Integer
Dim tmpnode As MSComctlLib.Node
Dim strKey As String
Dim strMsg As String

j = 0 ' Get check-marked Nodes count
For Each tmpnode In tv.Nodes
    If tmpnode.Checked Then
        tmpnode.Selected = True
        strKey = tmpnode.Key
        j = j + 1
    End If
Next

   If j > 1 Then
      MsgBox "Selected Nodes: " & j & vbCr & "Select Only One Node to Delete.", vbCritical, "cmdDelete()"
      Exit Sub
   End If

Set tmpnode = tv.Nodes.Item(strKey)
tmpnode.Selected = True
Set db = CurrentDb

'check the presense of Child Node(s) of marked Node
If tmpnode.Children > 0 Then
'Warnings:
'       Deleting Nodes at Random will leave orphaned Nodes
'       in the Table and end up with errors, during next Tree View loading process
    strMsg = "The Marked Node have " & tmpnode.Children & " Children. " & vbCr & "Delete the Child Nodes also?"
    If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
       'Double check and get confirmation.
       strMsg = "Delete Only the deepest set of Child Nodes" & vbCr
       strMsg = strMsg & "and their Parent Node at one time." & vbCr & vbCr
       strMsg = strMsg & "Are you sure to Proceed..?"
       If MsgBox(strMsg, vbYesNo + vbCritical, "cmdDelete()") = vbYes Then
            Do Until tmpnode.Children = 0
                nodId = Val(Mid(tmpnode.Child.Key, 2))
        'Delete Child Node
                tv.Nodes.Remove tmpnode.Child.Index
        'Delete the related record
                strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
                db.Execute strSql
            Loop
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End If

        nodId = Val(Mid(tmpnode.Key, 2))
    'Delete Parent
       tv.Nodes.Remove tmpnode.Key
       tv.Refresh
    'Delete Marked Record
        strSql = "DELETE Sample.*, Sample.ID FROM Sample WHERE (((Sample.ID)= " & nodId & "));"
        db.Execute strSql
       
      
    'Erase Property Values from Form
        With Me
            .TxtKey = ""
            .TxtParent = ""
            .Text = ""
        End With
    Set db = Nothing
    
End Sub

Private Sub cmdExpand_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = True
        Next

End Sub

Private Sub cmdCollapse_Click()
Dim nodExp As MSComctlLib.Node

        For Each nodExp In tv.Nodes
            nodExp.Expanded = False
        Next
End Sub

Private Sub Form_Load()
    CreateTreeView
    cmdExpand_Click
End Sub

Private Sub CreateTreeView()
Dim db As Database
Dim rst As Recordset
Dim nodKey As String
Dim ParentKey As String
Dim strText As String
Dim strSql As String

Set tv = Me.TreeView0.Object
tv.Nodes.Clear

'Pass ImageList control reference to TreeView's ImageList Property.
Set ImgList = Me.ImageList0.Object
tv.ImageList = ImgList

strSql = "SELECT ID, Desc, ParentID FROM Sample;"

Set db = CurrentDb
Set rst = db.OpenRecordset("sample", dbOpenTable)
Do While Not rst.EOF And Not rst.BOF
    If Nz(rst!ParentID, "") = "" Then
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add , , nodKey, strText, "folder_close", "folder_open"
    Else
        ParentKey = KeyPrfx & CStr(rst!ParentID)
        nodKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add ParentKey, tvwChild, nodKey, strText, "left_arrow", "right_arrow"
    End If
rst.MoveNext
Loop

rst.Close
On Error GoTo 0
Set rst = Nothing
Set db = Nothing

End Sub

Private Sub TreeView0_NodeCheck(ByVal Node As Object)
Dim xnode As MSComctlLib.Node

Set xnode = Node
  If xnode.Checked Then
    xnode.Selected = True

    With Me
        .TxtKey = xnode.Key
      If xnode.Text = xnode.FullPath Then
        .TxtParent = ""
      Else
        .TxtParent = xnode.Parent.Key
      End If
        .Text = xnode.Text
    End With
  Else
    xnode.Selected = False
    With Me
      .TxtKey = ""
      .TxtParent = ""
      .Text = ""
    End With
End If
End Sub


A visualização de design do formulário frmSample é fornecida abaixo:

Suas Observações, Comentários, Sugestões são bem-vindas.

O banco de dados de demonstração está anexado para download.



OBJETO DO DICIONÁRIO

  1. Noções básicas de objetos do dicionário
  2. Noções básicas de objetos do dicionário-2
  3. Classificação de chaves e itens de objetos de dicionário
  4. Exibir registros do dicionário
  5. Adicionar objetos de classe como itens de dicionário
  6. Atualizar item do dicionário de objetos de classe