Partager via


Comment : itérer au sein de tous les nœuds d'un contrôle TreeView Windows Forms

Il est parfois utile d'examiner chaque nœud d'un contrôle TreeView Windows Forms pour effectuer des calculs sur les valeurs de nœud. Cette opération peut être effectuée à l'aide d'une procédure récursive (méthode récursive en C# et C++) qui itère au sein de chaque nœud dans chaque collection de l'arbre.

Chaque objet TreeNode est doté de propriétés que vous pouvez utiliser pour naviguer dans son arborescence ; ces propriétés sont : FirstNode, LastNode, NextNode, PrevNode et Parent. La valeur de la propriété Parent est le nœud parent du nœud actuel. Les nœuds enfants du nœud actuel, le cas échéant, sont affichés dans sa propriété Nodes. Le contrôle TreeView lui-même est doté de la propriété TopNode qui correspond au nœud racine de toute l'arborescence.

Pour itérer au sein de tous les nœuds du contrôle TreeView

  1. Créez une procédure récursive (méthode récursive en C# et C++) testant chaque nœud.

  2. Appelez la procédure.

    L'exemple suivant montre comment imprimer la propriété Text de chaque objet TreeNode :

    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();
          }
       }
    

Voir aussi

Concepts

Procédures récursives (Visual Basic)

Autres ressources

TreeView, contrôle (Windows Forms)