遍历判断TreeNode指定节点的所有子节点是否全部展开的函数遇到点逻辑有关问题

遍历判断TreeNode指定节点的所有子节点是否全部展开的函数遇到点逻辑问题
我是这样写的:
//用于判断WinForm.TreeView里选中的节点是否全部展开
bool isNodeAllExplaned(TreeNode node){
if(node==null){
return false;
}
if(node.Nodes.Count>0){
//如果有子节点而且未展开,返回False
if(!node.IsExpanded){
return false;
}
else{
foreach(TreeNode subnode in node.Nodes){
if(subnode.Nodes.Count==0){
if(!subnode.IsExpanded){
return false;
}
else{
return true;
}
}
isNodeAllExplaned(subnode);
//自以为要用“迭代”
}
return false;
//这里如果不添加上面这句就报错说缺少一个返回值,但是添加上就会错
//添加上之后,只有最后一个有子节点的展开的节点返回 错误的false
//如果是return true就更错了
}
}
else{
return true;
}
}

如果这种写法一开始就是错的还请指点。

------解决思路----------------------
bool isNodeAllExplaned(TreeNode node)
{
    if (!node.IsExpanded)
        return false;

    foreach (TreeNode x in node.Nodes)
    {
        if (!isNodeAllExplaned(x))
            return false;
    }

    return true;
}
}

------解决思路----------------------
单纯去学什么“编程语法”是学不好程序设计的。你要把代码写的简明清晰,要多花精力在代码以外的东西上,少量时间才在代码上。
------解决思路----------------------
isNodeAllExplaned(subnode);
递归的时候你居然不判断返回值?
------解决思路----------------------
你既然使用了递归,也叫"迭代"
那么你需要知道它的再次调用的时候(里面判断的是子项)返回的是true还是false
......

感觉有点说不下去了.既然1楼给你代码了,你就照抄好了
逻辑问题,想说明白,你得明白逻辑.你不明白,那说也白说
------解决思路----------------------


private IEnumerable<TreeNode> GetChilds(TreeNode node)
        {
            var nodes = node.Nodes.Cast<TreeNode>();
            return nodes.Concat(nodes.SelectMany(x => GetChilds(x)));
        }
        public bool isNodeAllExplaned(TreeNode node)
        {
            var list = GetChilds(node);
            foreach (var item in list)
            {
                if (!item.IsExpanded)
                    return false;
            }
            return true;
        }


蛋疼   先获取该节点下的所有子节点。。然后遍历。。就这么简单
------解决思路----------------------
引用:
Quote: 回复:1#

实际用的时候有误,不过代码应该是对的啊、

1#写的代码只判断只当节点及其子孙节点是否全部展开,所以,你只需要传入TreeView.Root根节点就可以了啊
------解决思路----------------------
遍历TreeNode所有节点的磁盘目录示例
 private void ListViewShow(TreeNode NodeDir)//初始化ListView控件,把TrreView控件中的数据添加进来
        {
            ListViewFile.Clear();
            if (NodeDir.Parent == null)// 如果当前TreeView的父结点为空,就把我的电脑下的分区名称添加进来
            {
                foreach (string DrvName in Directory.GetLogicalDrives())//获得硬盘分区名
                {
                    ListViewItem ItemList = new ListViewItem(DrvName);
                    ListViewFile.Items.Add(ItemList);//添加进来
                }
            }//codego.net/1/1/1/
            else//如果当前TreeView的父结点不为空,把点击的结点,做为一个目录文件的总结点
            {
                foreach (string DirName in Directory.GetDirectories((string)NodeDir.Tag))//编历当前分区或文件夹所有目录
                {
                    ListViewItem ItemList = new ListViewItem(DirName);
                    ListViewFile.Items.Add(ItemList);
                }
                foreach (string FileName in Directory.GetFiles((string)NodeDir.Tag))//编历当前分区或文件夹所有目录的文件
                {
                    ListViewItem ItemList = new ListViewItem(FileName);
                    ListViewFile.Items.Add(ItemList);
                }
            }
        }