Vba 为什么我的树景公寓?

Vba 为什么我的树景公寓?,vba,recursion,treeview,Vba,Recursion,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 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没有显示任何子节点。

已解决:treeView正在工作,但根节点旁边没有显示+图标-您必须双击才能显示其子节点

递归函数在
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

这是一个TreeNodeCollection-那么这不完全是一个
vba
相关问题吗?@Vityata它怎么不与vba相关?@Tomalak-2选项1-它使用一个外部.NET库,它是一个VB.NET。那么它就不是VBA了。2.它正在使用外部.NET库访问VBA。然后是VBA,在这个问题上我看不到.NET。你怎么会想到.NET?这是一个可以在TreeView控件上更改的设置。