为啥我的树视图是平的?

Posted

技术标签:

【中文标题】为啥我的树视图是平的?【英文标题】:Why is my treeview flat?为什么我的树视图是平的? 【发布时间】:2017-11-21 09:57:02 【问题描述】:

我已经根据我的数据集构建了一个树形结构。现在我正在尝试使用以下代码在 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 没有显示任何子视图。

【问题讨论】:

这是一个 TreeNodeCollection - msdn.microsoft.com/en-us/library/… 那么这不完全是vba相关的问题吗? @Vityata 怎么不是vba相关的? @Tomalak - 2 个选项:选项 1 - 它使用外部 .NET 库,它是一个 VB.NET。那么它不是VBA。 2. 它使用外部.NET 库到VBA。那么它就是一个 VBA。 我在这个问题的任何地方都看不到 .NET。是什么让您想到 .NET? 【参考方案1】:

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

【讨论】:

这是您可以在 TreeView 控件上更改的设置。【参考方案2】:

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

【讨论】:

以上是关于为啥我的树视图是平的?的主要内容,如果未能解决你的问题,请参考以下文章

谁有这三本书任意一本的中文书评?

世界是平的吗?历史终结了吗?全球化与贸易摩擦相关12本书,大部分不错

uitableviewcell 自定义背景问题

干货分享丨 数据可视化专题:地形生成及高程分析

如何定位 SCNCamera 以使对象“刚好适合”视图?

在 tkinter 的树视图中选择多行并同时获取它们