2016-05-25 9 views
-1

Ich erstelle ein Formular in VB.net, das ein TreeView enthält. Diese TreeView ist mit erweiterbaren übergeordneten Knoten und entsprechenden untergeordneten Knoten gefüllt. Wenn der Benutzer das Programm ausführt, können sie alle gewünschten Knoten erweitern. Gibt es eine Möglichkeit, programmgesteuert zu speichern, welche Knoten erweitert wurden, damit das nächste Mal das Formular geladen wird, bleiben diese Knoten erweitert? Ich brauche nicht notwendigerweise codierte Beispiele (obwohl sie nützlich sein können), nur eine allgemeine Vorstellung von den Befehlen/Steuerungen/Logik, die im Programm verwendet werden sollen. Vielen Dank im Voraus!Vb.net Speichern, welche Knoten in TreeView erweitert wurden

+0

Es gibt ein paar Möglichkeiten. 'MySettings', speichern Sie in einer Datei mit binaryformatter, einer Datenbank, es liegt an Ihnen, wie Sie diese Daten speichern und zurück abrufen möchten. – Codexer

+0

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da es sich nicht um ein Programmierproblem, sondern eher um eine Empfehlung handelt. – Codexer

Antwort

0

Hier sind einige grundlegende Ideen, um Ihre Implementierung zu führen:

eine Liste erstellen Überblick über die Knoten zu halten, die derzeit erweitert werden:

Private _ExpandedNodeList As New List(Of String) 

Set-up zwei Event-Handler die AfterCollapse zu verfolgen und AfterExpand Ereignisse der TreeView - diese passieren, wenn ein Benutzer verschiedene Teile der Struktur öffnet/schließt. Der Trick dabei ist, dass die Event-Handler nur den Tag-Wert des Knotens hinzufügen und entfernen, der eine Zeichenfolge ist, die Sie beim Erstellen der Struktur auf dem Knoten gesetzt haben.

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 

Nehmen wir jetzt an, Sie haben einen Punkt in der Anwendung, wo Sie das TreeView in einem bestimmten Zustand wiederherstellen müssen. Sie können die Knoten in der TreeView rekursiv aufrufen und Expand für die in der Liste enthaltenen Knoten aufrufen.

Meine Implementierung sieht wie folgt aus:

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 

Hinweis: dieser Code nicht einfach garantiert arbeiten, indem sie in Ihrer Anwendung ablegen.

Zumindest müssen Sie sorgfältig überlegen, wie Sie Ihren Baum erstellen und ob Sie für jeden TreeNode einen Wert für das Tag festlegen.

Hoffentlich wird dies Ihnen den Anfang machen.

+0

Wow, das ist großartig, danke! Und wenn ich meine 'ExpandedNodesList' erstelle, wird diese gespeichert und verfügbar sein, wenn der Benutzer die Anwendung das nächste Mal startet? –

+0

Sie können die Liste definitiv speichern, aber Sie müssen es selbst tun. Wenn die Anwendung beispielsweise geschlossen wird, können Sie sie in eine Textdatei schreiben. Oder werfen Sie einen Blick in den Namespace System.Runtime.Serialization. –

+0

Ich denke, der Downvote hier ist, weil ich "Speichern" nicht als "Speichern in Datei" interpretiert habe, sondern "Speichern" als "Sichere irgendwo" interpretiert? Vive le Pedanterie, was? –

Verwandte Themen