为什么我的树视图是平的?

时间:2017-06-19 09:00:04

标签: vba recursion treeview

我已经从我的数据集构建了一个树结构。现在我尝试使用以下代码在TreeView中表示该层次结构。

首先,创建所有根音符:

For Each nodeObject In NodeCollection
    If nodeObject.rank = 0 Then
        treeUCD.Nodes.Add key:=nodeObject.Name, Text:=nodeObject.Description
    End If
Next nodeObject

然后,迭代层次结构的每个级别,并一次添加一个级别的子级:

For i = 1 To treeHeight
    For Each nodeObject In NodeCollection
        If nodeObject.rank = i Then
            treeUCD.Nodes.Add nodeObject.Parent.Name, tvwChild, _ 
                nodeObject.Name, nodeObject.Description
        End If
    Next nodeObject
Next I

但是每个节点都是作为根节点创建的。如何分配孩子?

修改 我如何为节点分配排名存在问题。我的递归函数每次都返回0,尽管逐步显示它正在递增:

Function GetRank(nodeObject As clsNode, ByRef rank As Integer)
    If nodeObject.Parent Is Nothing Then
        GetRank = rank
        Exit Function
    End If
    GetRank nodeObject.Parent, rank + 1
End Function

修改 迭代函数现在正在运行:

GetRank = GetRank(nodeObject.Parent, rank + 1)

但是TreeView没有显示任何子项。

2 个答案:

答案 0 :(得分:0)

已解决:TreeView正在运行,但根节点旁边没有显示+图标 - 您必须双击以显示其子项!

答案 1 :(得分:0)

您的递归函数不会在Else情况下返回值。这样更好:

Function GetRank(nodeObject As clsNode, rank As Integer) As Integer
    If nodeObject.Parent Is Nothing Then
        GetRank = rank
    Else
        GetRank = GetRank(nodeObject.Parent, rank + 1)
    End If
End Function

但实际上我在这里建议一个非递归变体,它更直接:

Function GetRank(nodeObject As clsNode) As Integer
    While Not nodeObject.Parent Is Nothing
        GetRank = GetRank + 1
        Set nodeObject = nodeObject.Parent
    Wend
End Function

您的树木建造也不是最佳选择。不是重复遍历节点,而是以与输入树组织相同的方式创建它们。

Sub CreateNodes(tv As TreeView, myNode As clsNode, Optional tvRefNode As node)
  Dim childNode As clsNode

  For Each childNode In myNode.Children
      CreateNodes tv, childNode, tv.nodes.Add( _
          Relative:=IIf(tvRefNode Is Nothing, vbNull, tvRefNode.Index), _
          Relation:=tvwChild, _
          Key:=myNode.Name, _
          Text:=myNode.Description _
      )
  Next childNode
End Sub

您现在需要做的就是将根节点作为起点传递。

CreateNodes myTreeView, myRootNode