Поделиться через


Практическое руководство. Перебор узлов элемента управления TreeView в Windows Forms

Обновлен: Ноябрь 2007

Время от времени рекомендуется проверять каждый узел в элементе управления Windows Forms TreeView для выполнения некоторых вычислений для значений узлов. Эта операция может быть выполнена с помощью рекурсивной процедуры (рекурсивного метода в C# и C++), в ходе которой просматривается каждый узел в каждой коллекции дерева.

Каждый объект TreeNode, представленный в дереве просмотра, имеет свойства FirstNode, LastNode, NextNode, PrevNode и Parent, которые можно использовать для перемещения по дереву. Свойство Parent определяет родительский узел текущего узла. Если у текущего узла есть дочерние узлы, они указаны в его свойстве Nodes. У самого элемента управления TreeView имеется свойство TopNode, определяющее корневой узел для всего дерева.

Итерация всех узлов элемента управления TreeView

  1. Создайте рекурсивную процедуру (в C# и C++ — рекурсивный метод) для проверки каждого узла.

  2. Вызовите эту процедуру.

    В следующем примере показано, как вывести на печать значение свойства Text каждого объекта 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();
          }
       }
    

См. также

Основные понятия

Рекурсивные процедуры

Другие ресурсы

Элемент управления TreeView (Windows Forms)