public void RemoveNode(TreeNodeCollection nodearry ,string str)
        {
            foreach (TreeNode NodeTemp in nodearry)
            {
                if (NodeTemp.Nodes.Count != 0)
                {
                    RemoveNode(NodeTemp.Nodes, str);
                }
                else
                {
                    string strTemp = NodeTemp.Text;
                    if (strTemp == str)
                    {
                        NodeTemp.Remove();
                     }
                }
            }
        }
我写的这个递归函数是删除树节点文本与传入的字符串一样的时候删除节点。
可没实现,比如说现在有9个节点的文本是“123”,我要删除“123”这个文本节点,只能删除几个,没全删掉。麻烦各位高人看看,是为什么啊??

解决方案 »

  1.   


    我没说清楚啊,我现在认为是我这个递归函数有问题的。
    我的需求就是删除不再含子节点的节点,比如说节点1下有9个节点的文本都是“123”,可却只删除了5个,请教的是这个问题。我调试发现有这么一句,prenode引起的异常,执行却没异常出现。
      

  2.   

    你在删除一个叶子节点的时候,引起了之前nodearry的改变吧
      

  3.   

    就是说你在删除一个子节点之后,他的父节点的NodeTemp.Nodes.Count 已经改变了,而且结合也变了,所以引起异常了
      

  4.   


    或许是,我刚看C#,foreach里,怎么减少呢?该怎么解决呢
      

  5.   


    了解了,应该是这样子的foreach是只读循环,就是foreach的集合在你操作中不能做任何改变(详见《efficetiveC#》),你这里删除的时候破坏了foreach循环的集合的结构了。
    解决方案:
    用for,每次TreeNodeCollection.Count把集合数量统计下 进行你的操作。
      

  6.   


    foreach是不能改变集合的啊?哦,晓得了,谢谢了
    我试下
      

  7.   

    应该是这样的,现在机器上没.net环境 看到问题只能裸分析,如有错误建议请不要见外
      

  8.   

    我博客里的,我贴这里了,问题和你的一样.
    警戒For each语句
      如果使用for each 在循环中进行移除(删除)集合中的项目时,不会达到预期的结果,而且不会显示错误。例如:for each  s in session.Contents    if len(s) = 5 then        session.Contents.Remove s    end ifnext运行结果并不会将符合len(s)=5的所有记录移除。据说是因为for each是使用链表的方式进行访问集合,当移除项目时,链表断裂,无法继续进行(此结论我未求证)。对于以上情况,请使用:for i=session.Contents.count to 0 step -1   s = session..Contents.key(i)    if len(s) = 5 then        session.Contents.Remove s    end ifnext此方法可以得到预期的结果。对所有类型的集合进行移除时,都建议不要使用for each语句。
      

  9.   


    我用for删除了,没问题的。
    再问下,efficetive C#是本什么书啊,我在网上怎么没见着啊,能给份么
      

  10.   


    里面一直在说foreach的好处,说是可以自动判断上下界生成正确的代码