2016-05-25 4 views
-1

私はTreeViewを含むVB.netでフォームを作成しています。このツリービューには、展開可能な親ノードと対応する子ノードが設定されます。ユーザーがプログラムを実行すると、必要なノードを展開できます。どのノードが展開されたのかをプログラムで保存する方法はありますか?次回にフォームがロードされると、それらのノードは展開されたままになりますか?私は必ずしもコード化された例は必要ではないが(有用であるかもしれないが)、プログラムで使うコマンド/コントロール/ロジックの一般的なアイデア。前もって感謝します!ここでVb.net TreeViewで展開されたノードを保存します。

+0

いくつかの方法があります。 MySettingsは、binaryformatterを使用してファイルに保存します。データベースは、このデータをどのように保存して元に戻すかはあなた次第です。 – Codexer

+0

私は、この問題をトピックではなく、プログラミングの問題に特化しているわけではないので、閉じることにしました。 – Codexer

答えて

0

は、あなたの実装を導くために、いくつかの基本的な考え方です:

現在展開されているノードを追跡するためにリストを作成します。

Private _ExpandedNodeList As New List(Of String) 

セットアップ2つのイベントハンドラAfterCollapseを追跡し、 TreeViewのAfterExpandイベントは、ユーザーがツリーの別の部分を開いたり閉じたりするときに発生します。ここでのトリックは、イベントハンドラがツリーを構築したときにノードに設定した文字列であるNodeのタグ値を追加して削除するだけです。

Private Sub TreeView_AfterCollapse(sender As Object, e As TreeViewEventArgs) Handles TreeView.AfterCollapse 
    If _ExpandedNodeList.Contains(e.Node.Tag.ToString) Then 
     _ExpandedNodeList.Remove(e.Node.Tag.ToString) 
    End If 
End Sub 
Private Sub TreeView_AfterExpand(sender As Object, e As TreeViewEventArgs) Handles TreeView.AfterExpand 
    If Not _ExpandedNodeList.Contains(e.Node.Tag.ToString) Then 
     _ExpandedNodeList.Add(e.Node.Tag.ToString) 
    End If 
End Sub 

ここでは、アプリケーション内で、TreeViewを特定の状態に復元する必要があるとします。 TreeViewでノードを再帰的に処理し、リスト内のノードでExpandを呼び出すことができます。私の実装では、このようになります

Private Sub ShowVisibleNodes() 
    Dim Node As TreeNode 

    For Each ExpandedChildNodeName As String In _ExpandedNodeList 
     For Each RootNode As TreeNode In TreeView.Nodes 
      Node = NodeFromTagName(ExpandedChildNodeName, RootNode) 
      If Node IsNot Nothing Then 
       Node.Expand() 
      End If 
     Next 
    Next 

End Sub 
Private Function NodeFromTagName(ByVal NodeTagName As String, NodeToSearch As TreeNode) As TreeNode 
    Dim NextNode As TreeNode 

    'check input node 
    If NodeToSearch.Tag IsNot Nothing Then 
     If NodeToSearch.Tag.Equals(NodeTagName) Then 
      Return NodeToSearch 
     End If 
    End If 

    'check child nodes and recurse on intermediary nodes 
    For Each Node As TreeNode In NodeToSearch.Nodes 
     If Node.Tag IsNot Nothing Then 
      If Node.Tag.Equals(NodeTagName) Then 
       Return Node 
      End If 
      NextNode = NodeFromTagName(NodeTagName, Node) 
      If NextNode IsNot Nothing Then 
       Return NextNode 
      End If 
     End If 
    Next 

    Return Nothing 

End Function 

(注)このコードは、アプリケーション内にドロップするだけで動作することが保証されていません。

少なくとも、ツリーの構築と各TreeNodeのタグに値を設定するかどうかについては、注意深く考える必要があります。

これがうまく始めるでしょう。

+0

うわー、本当にありがとう!そして、私が 'ExpandedNodesList'をビルドするとき、これが保存され、次回ユーザがアプリケーションを起動するときに利用可能になりますか? –

+0

あなたは間違いなくリストを保存することができますが、自分でそれを行う必要があります。たとえば、アプリケーションが終了すると、テキストファイルに書き出すことができます。または、System.Runtime.Serialization名前空間を参照してください。 –

+0

私は 'save'をファイルに保存すると解釈しなかったので、ここでdownvoteがあると思いますが、 'save'は 'somewhere safe'として解釈しますか? Vive le pedantry、ハァッ! –

関連する問題