如何获取 TreeView
控件中所有层级的节点列表?
您可以使用两个递归扩展方法。您可以调用 myTreeView.GetAllNodes()
或 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.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
假设您有一棵只有一个根节点的树,以下代码将始终循环树节点到最深处,然后返回一级。它将打印每个节点的文本。(从我的头部未经测试)
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);
}
}
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;
}
更新Krumelur的回答(将他/她解决方案的前两行替换为以下内容):
foreach ( var node in oYourTreeView.Nodes )
{
PrintNodesRecursive( node );
}
如果您不需要节点键是唯一的,只需将所有节点键设置为空字符串(""
),然后可以执行 Treeview1.Nodes.Find("", true);
返回 TreeView 中的所有节点。
Stack<TreeNode> nodeStack = new Stack<TreeNode>(treeview1.Nodes.Cast<TreeNode>());
while(nodeStack.Count > 0)
{
TreeNode node = nodeStack.Pop();
// Do your processing on the node here...
// Add all children to the stack
if(node.Nodes.Count > 0)
foreach(TreeNode child in node.Nodes)
nodeStack.Push(child);
}
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
}
}
foreach (TreeNode actualNode in treeView1.Nodes) // Begin with Nodes from TreeView
{
AddNodeAndChildNodesToList(actualNode);
}
List<T> EnumerateAllTreeNodes<T>(TreeView tree, T parentNode = null) where T : TreeNode
{
if (parentNode != null && parentNode.Nodes.Count == 0)
return new List<T>() { };
TreeNodeCollection nodes = parentNode != null ? parentNode.Nodes : tree.Nodes;
List<T> childList = nodes.Cast<T>().ToList();
List<T> result = new List<T>(1024); //Preallocate space for children
result.AddRange(childList); //Level first
//Recursion on each child node
childList.ForEach(n => result.AddRange(EnumerateAllTreeNodes(tree,n)));
return result;
}
使用方法很简单,只需要调用:
List<MyNodeType> allnodes = EnumerateAllTreeNodes<MyNodeType>(tree);
这段代码可以帮助您遍历所有TreeView列表,并确定当前深度级别。该代码可用于将TreeView项目保存到XML文件和其他用途。
int _level = 0;
TreeNode _currentNode = treeView1.Nodes[0];
do
{
MessageBox.Show(_currentNode.Text + " " + _level);
if (_currentNode.Nodes.Count > 0)
{
_currentNode = _currentNode.Nodes[0];
_level++;
}
else
{
if (_currentNode.NextNode != null)
_currentNode = _currentNode.NextNode;
else
{
_currentNode = _currentNode.Parent.NextNode;
_level--;
}
}
}
while (_level > 0);
ChildNodes
。 - Martin Braun