C# treeView 中遍历子节点问题

gdclxm 2017-06-13 03:20:29
private void button1_Click(object sender, EventArgs e)
{
GetChildren(treeView1.SelectedNode);
}

public void GetChildren(TreeNode nd)
{
// richTextBox1.AppendText(nd.Nodes.Count + "\r");
foreach (TreeNode Children in nd.Nodes)
{
// richTextBox1.AppendText(Children.Text+"\r");
if(Children.Nodes.Count > 0)//为什么这里用 while会出错,死循环
{
GetChildren(Children);
}
}
}
在vs2015中,转接的是access数据库。
上面用if正常,用 while会出错,出现死循环。
请指教!!
...全文
266 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
因为里面是递归呀,递归到方法最前面Children自然会变,当然也是相当于IF了。效果达到了。
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
现在看到了,吓我一跳,结贴前参与 了的我都给了分,再次谢谢大家了。
xuzuning 2017-06-13
  • 打赏
  • 举报
回复
while (Children.Nodes.Count > 0 ) { GetChildren(Children); break; } 是狗屁做法 执行一次就跳出循环,不就是 if 语句吗?
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
怎么搞的,我的给分是3+3+3+11,怎么只看到一个人得分。
xuzuning 2017-06-13
  • 打赏
  • 举报
回复
这跟 递归 没有关系
               while(Children.Nodes.Count > 0)/
                {
                    //GetChildren(Children);
                }
注释掉循环体,你就能看到他是死循环了 除非 GetChildren(Children) 中改变了 Children
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
引用 8 楼 Imaor 的回复:


//用while的话,请加入break
//不能因为count>0就无限递归
  while (Children.Nodes.Count > 0  ) 
                {
                    GetChildren(Children);
                    break;
                }
真是你所说的,还是我们对语句的概念性问题没弄透,是呀,我们只要在这里面只执行一次,然后跳出。分给你吧,谢谢大家了。
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
因为条件一直成立呗,本身 递归 就类似 while,只有某个条件不满足才不能继续进行运算。光看看不出什么,你Debug模式下 调试代码,看看每次的Children 是否都一样。
应该是 while是循环的原因吧,一直在 while里,跳不到方法的最前面。
IEEE_China 2017-06-13
  • 打赏
  • 举报
回复


//用while的话,请加入break
//不能因为count>0就无限递归
  while (Children.Nodes.Count > 0  ) 
                {
                    GetChildren(Children);
                    break;
                }
xuzuning 2017-06-13
  • 打赏
  • 举报
回复
pNode = pNode.Parent; 取 pNode 节点的上级节点 GetLevelOne(sNode, pNode); 每次的 pNode.Level 在变 而 while(Children.Nodes.Count > 0)/ { GetChildren(Children); } GetChildren(Children) 并没有改变 Children 所以用 while会出错,死循环
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
其实会改变的, 为什么IF能识别到0,while不行。
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
public string GetLevelOne(TreeNode sNode, TreeNode pNode)//返回选择节点的父节点的级数为1的字符 { pNode = sNode.Parent; while (pNode.Level > 1) { sNode = pNode; pNode = pNode.Parent; GetLevelOne(sNode, pNode); } return pNode.Text.ToString(); } 为什么这里可以用while
xuzuning 2017-06-13
  • 打赏
  • 举报
回复
Children.Nodes.Count 不会改变,所以用 while 就是死循环
gdclxm 2017-06-13
  • 打赏
  • 举报
回复
节点如果没有子节点时,count 是等于0的,有的话至少=1。
exception92 2017-06-13
  • 打赏
  • 举报
回复
因为条件一直成立呗,本身 递归 就类似 while,只有某个条件不满足才不能继续进行运算。光看看不出什么,你Debug模式下 调试代码,看看每次的Children 是否都一样。
xuggzu 2017-06-13
  • 打赏
  • 举报
回复
你的nodes.count又不会减少,while无法退出,自然死循环

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧