Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Někdy je užitečné prozkoumat každý uzel v ovládacím prvku Windows Forms TreeView, aby bylo možné provést výpočet hodnot uzlů. Tuto operaci lze provést pomocí rekurzivní metody (rekurzivní procedura v VB.NET), která iteruje přes každý uzel v každé kolekci stromu.
Každý objekt TreeNode ve stromovém zobrazení má vlastnosti, které můžete použít k procházení stromového zobrazení: FirstNode, LastNode, NextNode, PrevNodea Parent. Hodnota vlastnosti Parent je uzel, který je nadřazený aktuálnímu uzlu. Podřízené uzly aktuálního uzlu, pokud nějaké existují, jsou uvedeny ve vlastnosti Nodes. Samotný ovládací prvek TreeView má vlastnost TopNode, což je kořenový uzel celého zobrazení stromu.
Rekurzivní přístup
Rekurzivní přístup používá metodu, která zpracovává uzel stromu a potom volá stejnou metodu pro každý podřízený uzel. To se opakuje, dokud se nezpracují všechny uzly ve stromu. Nevýhodou tohoto přístupu je, že pokud je strom velký, můžete narazit na chybu přetečení zásobníku a dojít z paměti.
Následující příklad ukazuje, jak vytisknout vlastnost Text každého objektu TreeNode:
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);
}
}
Nerekurzivní přístup
Následující příklad je alternativní iterativní přístup k procházení uzlů stromu pomocí kolekce Queue<T>. Tento přístup nesleduje vztah nadřazenosti a podřízenosti uzlu, ale přesto zajišťuje, že se vytiskne každý uzel. Pokud chcete zpracovat každý uzel stromu a jeho podřízené položky, použijte nejprve kolekci Stack<T>.
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);
}
}
Viz také
.NET Desktop feedback