刷新树控件并显示以前选择的节点

时间:2013-08-01 13:58:05

标签: .net vb.net winforms controls

我有一个带有标准树控件的VB.NET winforms应用程序。树控件每五秒刷新一次,我希望如果选择了一个节点,那么在刷新后选择它。这是我的代码(m_oSelectedNode是一个全局treenode):

Public Sub SaveLabelNodes()
    m_cLabelTVNodes.Clear()

    If tvLabels.Nodes.Count = 0 Then
        Return
    End If
    m_LabelScrollPos = GetTreeViewScrollPos(tvLabels)
    m_oSelectedNode = tvLabels.SelectedNode
    m_bLabelRootExpanded = tvLabels.Nodes(0).IsExpanded
    For Each node As TreeNode In tvLabels.Nodes(0).Nodes
        Dim oNode As New NodeInfo
        oNode.bExpanded = node.IsExpanded
        oNode.szNodeName = node.Text
        m_cLabelTVNodes.Add(oNode)
    Next

End Sub

Public Sub RestoreLabelNodes()
    tvLabels.BeginUpdate()
    Dim nIndex As Integer = 0
    If m_bLabelRootExpanded Then
        tvLabels.Nodes(0).Expand()
    End If

    For Each oNode As NodeInfo In m_cLabelTVNodes

        If FindNode(tvLabels, oNode) Then
            If oNode.bExpanded Then
                tvLabels.Nodes(0).Nodes(nIndex).Expand()
            End If
        End If
        nIndex += 1
    Next
    If Not m_oSelectedNode Is Nothing Then
        tvLabels.SelectedNode = m_oSelectedNode
    End If
    SetTreeViewScrollPos(tvLabels, m_LabelScrollPos)

    tvLabels.EndUpdate()
End Sub

树形控件将滚动到最后一个位置,但最后一个选择不会选择!

1 个答案:

答案 0 :(得分:2)

您正在从原始信息中存储m_oSelectedNode(在删除节点之前),这在“新”TreeView中没有用。您必须依赖其他将保留的信息,例如:名称。

Dim m_oSelectedNode_NAME As String = tvLabels.SelectedNode.Name

然后在你的循环中:

For Each oNode As NodeInfo In m_cLabelTVNodes
    If FindNode(tvLabels, oNode) Then
       If oNode.bExpanded Then
          tvLabels.Nodes(0).Nodes(nIndex).Expand()
          if(tvLabels.Nodes(0).Nodes(nIndex).Name = m_oSelectedNode_NAME) Then
               tvLabels.SelectedNode = tvLabels.Nodes(0).Nodes(nIndex)
          Endif
       End If
    End If
    nIndex += 1
Next

这只是一个通用的解决方案,只考虑儿童;你必须将它扩展到主要节点(或儿童的孩子)的帐户。