Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A veces resulta útil examinar todos los nodos de un control de Windows Forms TreeView para realizar algún cálculo en los valores del nodo. Esta operación se puede realizar mediante un método recursivo (procedimiento recursivo en VB.NET) que recorre en iteración cada nodo de cada colección del árbol.
Cada TreeNode objeto de una vista de árbol tiene propiedades que puede usar para navegar por la vista de árbol: FirstNode, LastNode, NextNode, PrevNodey Parent. El valor de la Parent propiedad es el nodo primario del nodo actual. Los nodos secundarios del nodo actual, si hay alguno, se muestran en la propiedad Nodes. El TreeView propio control tiene la TopNode propiedad , que es el nodo raíz de toda la vista de árbol.
Enfoque recursivo
El enfoque recursivo usa un método que procesa un nodo de árbol y, a continuación, llama al mismo método para cada nodo secundario. Esto se repite hasta que se procesa cada nodo del árbol. El inconveniente de este enfoque es que si el árbol es grande, es posible que se produzca un error de desbordamiento de pila y se agote la memoria.
En el ejemplo siguiente se muestra cómo imprimir la propiedad TreeNode de cada objeto Text.
private void PrintRecursive(TreeNode treeNode)
{
// Print the node.
System.Diagnostics.Debug.WriteLine(treeNode.Text);
MessageBox.Show(treeNode.Text);
// Visit 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.
foreach (TreeNode n in treeView.Nodes)
{
//recursiveTotalNodes++;
PrintRecursive(n);
}
}
Private Sub PrintRecursive(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(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.
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
{
delete(myNodes);
}
}
// 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
{
delete(myNodes);
}
}
Enfoque no recursivo
El ejemplo siguiente es un enfoque iterativo alternativo para recorrer los nodos del árbol mediante una Queue<T> colección. Este enfoque no sigue la relación padre-hijo de un nodo, sólo garantiza que se imprima cada nodo. Si desea procesar cada nodo de árbol y sus elementos secundarios, use primero la Stack<T> colección.
private void PrintNonRecursive(TreeNode treeNode)
{
if (treeNode != null)
{
//Using a queue to store and process each node in the TreeView
Queue<TreeNode> staging = new Queue<TreeNode>();
staging.Enqueue(treeNode);
while (staging.Count > 0)
{
treeNode = staging.Dequeue();
// Print the node.
System.Diagnostics.Debug.WriteLine(treeNode.Text);
MessageBox.Show(treeNode.Text);
foreach (TreeNode node in treeNode.Nodes)
{
staging.Enqueue(node);
}
}
}
}
// Call the procedure using the TreeView.
private void CallNonRecursive(TreeView treeView)
{
// Print each node.
foreach (TreeNode n in treeView.Nodes)
{
PrintNonRecursive(n);
}
}
Private Sub PrintNonrecursive(n As TreeNode)
If n IsNot Nothing Then
Dim staging As Queue(Of TreeNode) = New Queue(Of TreeNode)
staging.Enqueue(n)
While staging.Count > 0
n = staging.Dequeue()
'Print the node.
System.Diagnostics.Debug.WriteLine(n.Text)
MessageBox.Show(n.Text)
Dim node As TreeNode
For Each node In n.Nodes
staging.Enqueue(node)
Next
End While
End If
End Sub
Private Sub CallNonRecursive(aTreeView As TreeView)
Dim n As TreeNode
For Each n In aTreeView.Nodes
PrintNonrecursive(n)
Next
End Sub
private:
void PrintNonRecursive(TreeNode^ treeNode)
{
//Using a queue to store and process each node in the TreeView
Queue^ staging = gcnew Queue();
staging->Enqueue(treeNode);
while (staging->Count > 0)
{
treeNode = safe_cast<TreeNode^>(staging->Dequeue());
// Print the node.
System::Diagnostics::Debug::WriteLine(treeNode->Text);
MessageBox::Show(treeNode->Text);
System::Collections::IEnumerator^ children = (safe_cast<System::Collections::IEnumerable^>(treeNode->Nodes))->GetEnumerator();
try
{
while (children->MoveNext())
{
staging->Enqueue(children->Current);
}
}
finally
{
delete(children);
}
}
// 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
{
delete(myNodes);
}
}
// Call the procedure using the TreeView.
void CallNonRecursive(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);
PrintNonRecursive(n);
}
}
finally
{
delete(myNodes);
}
}
Consulte también
.NET Desktop feedback