按排序顺序获取TreeView节点

时间:2019-03-07 11:42:14

标签: vb6 treeview

我们有一个使用默认Microsoft TreeView控件以VB6编写的旧版应用程序,用于显示分层数据。由于TreeView中包含大量信息,因此我们考虑为用户实施较小的过滤器/搜索可能性。

第一个尝试是切换可见性,并且仅使符合定义搜索的节点(及其父节点)可见。但这是不可能的,因为默认的Microsoft TreeView控件不允许其节点可见或不可见。

因此,第二个尝试是遍历树中的所有节点,并确保当节点与定义的搜索匹配时可见(并停止遍历)。如果找到的节点不是该节点,则用户正在寻找,他可以“继续”搜索并寻找下一个符合其条件的节点。

到目前为止,除了一个小问题外,它的效果还不错。搜索无法从上到下进行,因为树中的数据是按照随机排序的顺序填充的,然后通过设置每个节点的Sorted属性(旧版代码)进行排序。因此,搜索将遍历随机添加的节点,并且找到的节点在顶级节点之间“跳转”(Nodes的{​​{1}}集合按添加顺序包含所有节点,而不仅仅是顶层节点,而不是按照向用户展示的顺序排列。

是否有任何方法可以按向用户显示的顺序获取树的所有节点?我不想更改用数据填充树的旧代码,并且在将数据添加到TreeView之前对数据进行排序可能会影响性能。

请注意,我说的是用 VB6 编写的应用程序,因此,没有LINQ这样的东西可以按所需顺序遍历节点。

到目前为止,这是我的搜索代码:

TreeView

1 个答案:

答案 0 :(得分:0)

您应该使用Child和Next属性来完成您要的内容,而不是通过整数遍历TreeView节点集合。以下代码将按照它们在TreeView控件中出现的顺序打印所选节点的子级:

Private Sub Command3_Click()
  If Not TreeView1.SelectedItem Is Nothing Then
    PrintNodesInSortedOrder TreeView1.SelectedItem
  End If
End Sub

Private Sub PrintNodesInSortedOrder(ParentNode As MSComctlLib.Node)
  Dim Nod As MSComctlLib.Node

  Set Nod = ParentNode.Child
  Do While Not Nod Is Nothing
    Debug.Print Nod.Text
    Set Nod = Nod.Next
  Loop

End Sub