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

runerback 2015-01-28 10:52:47
我是这样写的:
//用于判断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;
}
}

如果这种写法一开始就是错的还请指点。
...全文
462 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
长空X 2015-02-06
  • 打赏
  • 举报
回复
引用 13 楼 shaoerbao 的回复:
[quote=引用 9 楼 hjkl950217 的回复:] 这种查看目录的分支叫什么呀
TreeView 竟然木有集成判断是否全部展开的方法、、[/quote]那会不会在别的类里?
qwe_1441570594 2015-02-02
  • 打赏
  • 举报
回复
遍历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); } } }
runerback 2015-01-29
  • 打赏
  • 举报
回复
回复:sp1234
代码以外的东西?是算法吗? 感觉现在要做一个自己用的小程序,绝大部分时间都在网上找代码抄代码,如果和自己程序里的情境有点出入而又找不到现成代码就感觉束手无策心里干着急。
runerback 2015-01-29
  • 打赏
  • 举报
回复
引用 9 楼 hjkl950217 的回复:
这种查看目录的分支叫什么呀
TreeView 竟然木有集成判断是否全部展开的方法、、
runerback 2015-01-29
  • 打赏
  • 举报
回复
引用 10 楼 dongxinxi 的回复:
1#写的代码只判断只当节点及其子孙节点是否全部展开,所以,你只需要传入TreeView.Root根节点就可以了啊
全部展开后根节点返回false
runerback 2015-01-29
  • 打赏
  • 举报
回复
引用 8 楼 lyj224170707 的回复:


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;
        }
报错: Instance argument: cannot convert from 'System.Windows.Forms.TreeNodeCollection' to 'System.Data.EnumerableRowCollection' (CS1929); 'System.Windows.Forms.TreeNodeCollection' does not contain a definition for 'Cast' and the best extension method overload 'System.Data.EnumerableRowCollectionExtensions.Cast<TResult>(System.Data.EnumerableRowCollection)' has some invalid arguments (CS1928);
  • 打赏
  • 举报
回复
引用 4 楼 shaoerbao 的回复:
[quote=回复:1#]
实际用的时候有误,不过代码应该是对的啊、 [/quote] 1#写的代码只判断只当节点及其子孙节点是否全部展开,所以,你只需要传入TreeView.Root根节点就可以了啊
长空X 2015-01-29
  • 打赏
  • 举报
回复
这种查看目录的分支叫什么呀
游离失所 2015-01-29
  • 打赏
  • 举报
回复


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;
        }
蛋疼 先获取该节点下的所有子节点。。然后遍历。。就这么简单
於黾 2015-01-29
  • 打赏
  • 举报
回复
你既然使用了递归,也叫"迭代" 那么你需要知道它的再次调用的时候(里面判断的是子项)返回的是true还是false ...... 感觉有点说不下去了.既然1楼给你代码了,你就照抄好了 逻辑问题,想说明白,你得明白逻辑.你不明白,那说也白说
runerback 2015-01-29
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
isNodeAllExplaned(subnode); 递归的时候你居然不判断返回值?
可以说明白点么,作为新手刚吃完饭脑袋变笨、、
於黾 2015-01-29
  • 打赏
  • 举报
回复
isNodeAllExplaned(subnode); 递归的时候你居然不判断返回值?
runerback 2015-01-29
  • 打赏
  • 举报
回复
回复:1#

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

  • 打赏
  • 举报
回复
单纯去学什么“编程语法”是学不好程序设计的。你要把代码写的简明清晰,要多花精力在代码以外的东西上,少量时间才在代码上。
  • 打赏
  • 举报
回复
bool isNodeAllExplaned(TreeNode node)
{
    if (!node.IsExpanded)
        return false;

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

    return true;
}
}

110,538

社区成员

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

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

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