我们有一个使用默认Microsoft TreeView
控件以VB6编写的旧版应用程序,用于显示分层数据。由于TreeView
中包含大量信息,因此我们考虑为用户实施较小的过滤器/搜索可能性。
第一个尝试是切换可见性,并且仅使符合定义搜索的节点(及其父节点)可见。但这是不可能的,因为默认的Microsoft TreeView
控件不允许其节点可见或不可见。
因此,第二个尝试是遍历树中的所有节点,并确保当节点与定义的搜索匹配时可见(并停止遍历)。如果找到的节点不是该节点,则用户正在寻找,他可以“继续”搜索并寻找下一个符合其条件的节点。
到目前为止,除了一个小问题外,它的效果还不错。搜索无法从上到下进行,因为树中的数据是按照随机排序的顺序填充的,然后通过设置每个节点的Sorted
属性(旧版代码)进行排序。因此,搜索将遍历随机添加的节点,并且找到的节点在顶级节点之间“跳转”(Nodes
的{{1}}集合按添加顺序包含所有节点,而不仅仅是顶层节点,而不是按照向用户展示的顺序排列。
是否有任何方法可以按向用户显示的顺序获取树的所有节点?我不想更改用数据填充树的旧代码,并且在将数据添加到TreeView
之前对数据进行排序可能会影响性能。
请注意,我说的是用 VB6 编写的应用程序,因此,没有LINQ这样的东西可以按所需顺序遍历节点。
到目前为止,这是我的搜索代码:
TreeView
答案 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