World of Web

Speichern und Laden der Expansion-States eines TreeViews

by on Okt.05, 2010, under Kurztutorials

Da uns das Standard Tree-View Control der WinForms keine Methode zur Verfügung stellt, die Expansion-States zu speichern und später wieder zu laden, wird in diesem Tutorial eine recht einfache Variante erarbeitet, welche genau zu diesem Ziel führen wird.

Grund-Überlegung

Die Baumknoten, die expandiert sind, werden in eine Liste hinzugefügt und beim Laden wird dann überprüft, ob sich der momentane Knoten in der Liste befindet oder nicht.

Deklaration der Liste

1
private List<TreeNode> expandedNodeList = new List<TreeNode>();

Es wird eine leere Liste aus TreeNodes erstellt, mit der dann später gearbeitet werden kann.

Speicher-Funktion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void saveExpandStates(TreeNode tn)
{
   if (tn.IsExpanded)
   {
      expandedNodeList.Add(tn);
      if (tn.Nodes.Count > 0)
      {
         foreach (TreeNode t in tn.Nodes)
            saveExpandStates(t);
      }
      else
         return;
   }
   else
      return;
}

Der Funktion wird ein Start-Knoten übergeben, welcher dann auf seinen Expandierungs-Status überprüft wird. Sollte dieser Knoten expandiert sein, so wird er in die Liste aufgenommen und es wird weiterhin überprüft, ob dieser Knoten Kind-Knoten besitzt. Sollte dies der Fall sein, so werden alle Kind-Knoten durchlaufen und so werden alle Knoten rekursiv auf ihren Status überprüft.

Lade-Funktion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void resumeExpandStates(TreeNode tn)
{
   foreach (TreeNode tnLst in expandedNodeList)
   {
      if (tnLst.Text == tn.Text)
      {
         if (tnLst.Parent == tn.Parent)
         {
            tn.Expand();
            if (tn.Nodes.Count > 0)
            {
               foreach (TreeNode t in tn.Nodes)
                  resumeExpandStates(t);
            }
         }
         else if (tn.Parent == null)
            break;
         else if (tnLst.Parent.Text == tn.Parent.Text)
         {
            tn.Expand();
            if (tn.Nodes.Count > 0)
            {
               foreach (TreeNode t in tn.Nodes)
                  resumeExpandStates(t);
            }
         }
      }
   }
}

Es werden alle Elemente der Liste durchlaufen und es wird abgeprüft, ob es sich beim gegebenen Knoten um einen expandierten Knoten handelt, oder nicht.

Dabei wird überprüft, ob sich die Knoten im Text gleichen und in den Parent-Knoten.

Diese Überprüfung kann auf alle Eventualitäten angepasst werden. (z.B. Überprüfung auf eine eindeutige ID im Namen oder Tag des Knotens)

Bei einem Treffer wird der entsprechende Knoten expandiert und rekursiv durchlaufen.

Sollten in diesem Tutorial Fehler enthalten sein, oder jemand eine performantere Lösung des Problems haben, so würde ich mich über Feedback freuen.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to MySpace Post to Ping.fm Post to Reddit Post to StumbleUpon

Share on Facebook




Leave a Reply