Vb6 按排序顺序获取TreeView节点

Vb6 按排序顺序获取TreeView节点,vb6,treeview,Vb6,Treeview,我们有一个用VB6编写的遗留应用程序,它使用默认的MicrosoftTreeView控件来显示分层数据。由于此TreeView中包含大量信息,我们考虑为用户实现一个小的筛选/搜索可能性 第一次尝试是切换可见性,并仅使节点(及其父节点)可见,以匹配定义的搜索。但这是不可能的,因为默认的MicrosoftTreeView控件不允许其节点可见或不可见 因此,第二次尝试是遍历树中的所有节点,并确保节点在与定义的搜索匹配时的可见性(并停止遍历)。当找到的节点不是用户要查找的节点时,他可以“继续”搜索并查找

我们有一个用VB6编写的遗留应用程序,它使用默认的Microsoft
TreeView
控件来显示分层数据。由于此
TreeView
中包含大量信息,我们考虑为用户实现一个小的筛选/搜索可能性

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

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

到目前为止,除了一个小问题外,这项工作相当不错。搜索无法从上到下进行,因为树中以随机排序顺序填充数据,然后通过设置每个节点(遗留代码)的
sorted
属性进行排序。因此,搜索将通过随机添加的节点进行,找到的节点在顶级节点之间“跳跃”(
TreeView
nodes
集合包含所有按添加顺序添加的节点,而不仅仅是顶级节点,也不是按向用户显示的顺序)

有没有办法按照向用户显示的顺序获取树的所有节点?我不喜欢更改用数据填充树的遗留代码,在将数据添加到
TreeView
之前对数据进行排序可能会影响性能

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

以下是我目前的搜索代码:

Private Sub cmdSearch_Click()
    Dim oMatch As Node

    Set oMatch = GetNextMatch

    If Not (oMatch Is Nothing) Then
        oMatch.EnsureVisible
        oMatch.Selected = True
        Me.TreeView1.SelectedItem = oMatch
        Me.TreeView1.SetFocus
    End If

End Sub

Private Function GetNextMatch() As Node
    Dim lIndex As Long
    Dim oResult As Node

    For lIndex = mlLastFoundIndex + 1 To Me.TreeView1.Nodes.Count
        If IsMatch(Me.TreeView1.Nodes(lIndex).Text) Then
            Set oResult = Me.TreeView1.Nodes(lIndex)
            mlLastFoundIndex = lIndex
            Exit For
        End If
    Next lIndex

    Set GetNextMatch = oResult
End Function

Private Sub txtSearch_Change()
    mlLastFoundIndex = 0
End Sub

您不应该按整数遍历TreeView节点集合,而应该使用Child和Next属性来完成您的请求。以下代码将按选定节点在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

听起来您已经找到了这一困难的根本原因——treeview本身被用作这些操作的“主”数据结构。如果你有一个单独的数据结构,你可以实现你想要的任何东西,然后把结果复制到树视图中。我可以看出,对于一个现有的应用程序来说,这可能需要做很多工作,但从长远来看,这种重构有时会变得更容易。。。我同意DaveInCaz的观点,但是你能发布你正在使用的“搜索”代码吗?我以前使用过控件,它可能很奇怪。我认为节点的索引从0开始。不,使用
节点的索引从1开始。我在问题中输入了搜索码。我正在寻找能够按照节点呈现给用户的顺序传递
Me.TreeView1.Nodes