Gewusst wie: Durchlaufen aller Knoten eines TreeView-Steuerelements in Windows Forms

Manchmal ist es sinnvoll, alle Knoten in einem TreeView-Steuerelement von Windows Forms zu prüfen, um Berechnungen an den Knotenwerten durchzuführen. Diese Operation kann mit einer rekursiven Prozedur (rekursive Methode in C# und C++) durchgeführt werden, die alle Knoten in allen Auflistungen der Struktur durchläuft.

Jedes TreeNode-Objekt in einer Strukturansicht verfügt über Eigenschaften, mit deren Hilfe Sie in der Strukturansicht navigieren können: FirstNode, LastNode, NextNode, PrevNode und Parent. Der Wert der Parent-Eigenschaft entspricht dem Knoten, der dem aktuellen Knoten übergeordnet ist. Die Knoten, die dem aktuellen Knoten untergeordnet sind (falls vorhanden), sind in dessen Nodes-Eigenschaft aufgeführt. Das TreeView-Steuerelement selbst verfügt über die TopNode-Eigenschaft, bei der es sich um den Stammknoten der gesamten Strukturansicht handelt.

So gehen Sie alle Knoten des TreeView-Steuerelements durch

  1. Erstellen Sie eine rekursive Prozedur (rekursive Methode in C# und C++), die jeden einzelnen Knoten testet.

  2. Rufen Sie die Prozedur auf.

    Das folgende Beispiel zeigt, wie die Text-Eigenschaft der verschiedenen TreeNode-Objekte ausgegeben werden kann:

    Private Sub PrintRecursive(ByVal n As TreeNode)
       System.Diagnostics.Debug.WriteLine(n.Text)
       MessageBox.Show(n.Text)
       Dim aNode As TreeNode
       For Each aNode In n.Nodes
          PrintRecursive(aNode)
       Next
    End Sub
    
    ' Call the procedure using the top nodes of the treeview.
    Private Sub CallRecursive(ByVal aTreeView As TreeView)
       Dim n As TreeNode
       For Each n In aTreeView.Nodes
          PrintRecursive(n)
       Next
    End Sub
    
    private void PrintRecursive(TreeNode treeNode)
    {
       // Print the node.
       System.Diagnostics.Debug.WriteLine(treeNode.Text);
       MessageBox.Show(treeNode.Text);
       // Print each node recursively.
       foreach (TreeNode tn in treeNode.Nodes)
       {
          PrintRecursive(tn);
       }
    }
    
    // Call the procedure using the TreeView.
    private void CallRecursive(TreeView treeView)
    {
       // Print each node recursively.
       TreeNodeCollection nodes = treeView.Nodes;
       foreach (TreeNode n in nodes)
       {
          PrintRecursive(n);
       }
    }
    
    private void PrintRecursive(TreeNode treeNode) 
    {
       // Print the node.
       System.Diagnostics.Debug.WriteLine(treeNode.get_Text());
       MessageBox.Show(treeNode.get_Text());
       for(int i = 0; i < treeNode.GetNodeCount(false); ++i) // Print each node recursively.
       {
          PrintRecursive(treeNode.get_Nodes().get_Item(i));
       }
    }
    
    // Call the procedure using the TreeView.
    private void CallRecursive(TreeView treeView) 
    {
       // Print each node recursively.
       TreeNodeCollection nodes = treeView.get_Nodes();
       for(int i = 0; i < nodes.get_Count(); ++i)
       {
          PrintRecursive(nodes.get_Item(i));
       }
    }
    
    private:
       void PrintRecursive( TreeNode^ treeNode )
       {
          // Print the node.
          System::Diagnostics::Debug::WriteLine( treeNode->Text );
          MessageBox::Show( treeNode->Text );
    
          // Print each node recursively.
          System::Collections::IEnumerator^ myNodes = (safe_cast<System::Collections::IEnumerable^>(treeNode->Nodes))->GetEnumerator();
          try
          {
             while ( myNodes->MoveNext() )
             {
                TreeNode^ tn = safe_cast<TreeNode^>(myNodes->Current);
                PrintRecursive( tn );
             }
          }
          finally
          {
             IDisposable^ disposable = dynamic_cast<System::IDisposable^>(myNodes);
             if ( disposable != nullptr )
                      disposable->Dispose();
          }
       }
    
       // Call the procedure using the TreeView.
       void CallRecursive( TreeView^ treeView )
       {
          // Print each node recursively.
          TreeNodeCollection^ nodes = treeView->Nodes;
          System::Collections::IEnumerator^ myNodes = (safe_cast<System::Collections::IEnumerable^>(nodes))->GetEnumerator();
          try
          {
             while ( myNodes->MoveNext() )
             {
                TreeNode^ n = safe_cast<TreeNode^>(myNodes->Current);
                PrintRecursive( n );
             }
          }
          finally
          {
             IDisposable^ disposable = dynamic_cast<System::IDisposable^>(myNodes);
             if ( disposable != nullptr )
                      disposable->Dispose();
          }
       }
    

Siehe auch

Konzepte

Rekursive Prozeduren (Visual Basic)

Weitere Ressourcen

TreeView-Steuerelement (Windows Forms)