Jak uzyskać listę wszystkich węzłów drzewa (na wszystkich poziomach) w formancie TreeView
?Uzyskaj listę wszystkich węzłów drzewa (na wszystkich poziomach) w kontrolkach TreeView
Odpowiedz
Zakładając, że masz drzewo z jednym węzłem głównym, poniższy kod zawsze zapętnieje węzły drzew w dół do najgłębszych, a następnie cofnie się o jeden poziom wstecz i tak dalej. Wypisze tekst każdego węzła. (Nietestowane od szczytu głowy)
TreeNode oMainNode = oYourTreeView.Nodes[0];
PrintNodesRecursive(oMainNode);
public void PrintNodesRecursive(TreeNode oParentNode)
{
Console.WriteLine(oParentNode.Text);
// Start recursion on all subnodes.
foreach(TreeNode oSubNode in oParentNode.Nodes)
{
PrintNodesRecursive(oSubNode);
}
}
Update do odpowiedzi Krumelur użytkownika (zamiast 2 pierwsze linie jego/jej rozwiązania z tym):
foreach (var node in oYourTreeView.Nodes)
{
PrintNodesRecursive(node);
}
Tak, to wypluje wszystkie poddrzewa, jeśli istnieje kilka korzeni. Ale tak naprawdę: drzewo z kilkoma węzłami jest naprawdę rzadkie :-) Aha, i to jest "jego";) – Krumelur
W rzeczywistości jest to dość powszechna phaenommena :) W programowaniu mogę sobie wyobrazić kilka scenariuszy gdzie jest to przydatne. Na przykład: widok drzewa zawierający działy firmy, z których każda ma podjednostki i tak dalej. Prawdopodobnie nie będziesz mieć żadnego superdepartetu. – dzendras
Masz rację. Poprawiłem odpowiedź. Był literówka. – Krumelur
podejścia Lazy LINQ, tak na wszelki wypadek Szukamy czegoś takiego:
private void EnumerateAllNodes()
{
TreeView myTree = ...;
var allNodes = myTree.Nodes
.Cast<TreeNode>()
.SelectMany(GetNodeBranch);
foreach (var treeNode in allNodes)
{
// Do something
}
}
private IEnumerable<TreeNode> GetNodeBranch(TreeNode node)
{
yield return node;
foreach (TreeNode child in node.Nodes)
foreach (var childChild in GetNodeBranch(child))
yield return childChild;
}
Można użyć dwóch metod rekurencyjnego rozszerzenia. Można też zadzwonić myTreeView.GetAllNodes()
lub myTreeNode.GetAllNodes()
:
public static List<TreeNode> GetAllNodes(this TreeView _self)
{
List<TreeNode> result = new List<TreeNode>();
foreach (TreeNode child in _self.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
public static List<TreeNode> GetAllNodes(this TreeNode _self)
{
List<TreeNode> result = new List<TreeNode>();
result.Add(_self);
foreach (TreeNode child in _self.ChildNodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
Ponieważ TreeView ma wiele poziomów, zrobić rekurencyjną funkcję:
public void AddNodeAndChildNodesToList(TreeNode node)
{
listBox1.Items.Add(node.Text); // Adding current nodename to ListBox
foreach (TreeNode actualNode in node.Nodes)
{
AddNodeAndChildNodesToList(actualNode); // recursive call
}
}
niż wywołać tę funkcję dla wszystkich węzłów poziom pierwszy w TreeView:
foreach (TreeNode actualNode in treeView1.Nodes) // Begin with Nodes from TreeView
{
AddNodeAndChildNodesToList(actualNode);
}
Kod jest z witryny C# TreeView
Jeśli nie potrzebujesz klucza węzła, aby był unikalny, po prostu ustaw wszystkie klucze węzłów na pusty ciąg znaków (""
), następnie możesz wykonać Treeview1.Nodes.Find("", true);
, aby zwrócić wszystkie węzły w obrębie TreeView.
Jeśli odpowiedź jest satysfakcjonująca, byłoby dobrze, gdybyś ją zaakceptował. Dzięki. – Krumelur