我用foreach来解决这个问题。我从未遇到过错误。但它发送了错误的项目。
我想这样做:根:1,2,3 和子节点:a,b,c,d,e,f。RichTextBox 将如下所示:1
->a->b->2->c->d->3->e->f。这是代码:
foreach (TreeNode root in treeView1.Nodes)
{
foreach (TreeNode child in root.Nodes)
{
richTextBox1.SelectedText = (root.Text + "->" + child.Text);
}
}
但它看起来像这样:1->a1->b2->c2->d3->e3->f。
我哪里做错了?
你正在做的是,对于每个根>子对,你正在写TextBox
末尾的值。这将在 for 循环中的每次迭代中为您提供 1->a|1->b|2->c|2->d|3->e|3->f。当您删除管道并合并所有迭代时,您将获得 1->a1->b2->c2->d3->e3->f,如您发布的那样。(这可以通过逐步调试找到)。
更好的选择是先将TreeView
转换为字符串,然后将其添加到TextBox
。您的问题是使用递归的完美示例。首先需要创建一个将树转换为字符串的方法,然后将该字符串写入文本框。这也处理具有两个以上深度的TreeView
。
private string TreeViewToString(TreeView tv, string delimiter) {
var result = new StringBuilder();
foreach (TreeNode node in tv.Nodes) {
TraverseNodes(node, delimited, result);
}
if (result.Length < delimiter.Length) {
return result.ToString();
} else {
return result.ToString(0, result.Length - delimiter.Length);
}
}
// recursive part
private void TraverseNodes(TreeNode node, string delimiter, StringBuilder result) {
result.AppendFormat("{0}{1}", node.Text, delimiter); // add node to string
foreach (TreeNode subNode in node.Nodes) {
TravserseNodes(subNode, delimiter, result); // recurse into nodes children
}
}
有很多方法可以做到这一点,但这里有一种方法,它应该相当直接(如果你理解递归)。