Практическое руководство. Перебор узлов элемента управления TreeView в Windows Forms
Иногда полезно изучить каждый узел в формах Windows TreeView управления для выполнения определенных расчетов со значениями узлов. Выполнить эту операции можно с помощью рекурсивной процедуры (рекурсивного метода в C# и C++), которая перебирает каждый узел в каждой коллекции дерева.
Каждый TreeNode объекта в виде дерева имеет свойства, которые можно использовать для перемещения по дереву: FirstNode, LastNode, NextNode, PrevNode, и Parent. Значение Parent свойства служит родительским узлом текущего узла. Дочерние узлы текущего узла, если таковые имеются, перечисляются в его Nodes свойство. TreeView Сам элемент управления имеет TopNode свойство, которое является корневым узлом для всего дерева.
Перебор всех узлов элемента управления в представлении в виде дерева
Создайте рекурсивную процедуру (рекурсивный метод в C# и C++) для проверки каждого узла.
Вызовите процедуру.
Следующий пример описывает печать каждый TreeNode объекта Text свойство:
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->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(); } }