Winform如何递归删除TreeView选中的节点? 
 Winform如何递归删除TreeView选中的节点?本文提供了两种方法,大家最常用的还是递归方法吧,本文还增加了一种非递归方法,有兴趣的同学也看看吧!先说C#递归方法,整体思路是:首先对根节点下的所有子节点做一个循环,在循环体里边,①判断该子节点是否是叶节点,是的话就移除该节点,并且将子节点数count减一,计数器i也减一,否则就递归调用方法traverse ( childNode )并重新获取该节点的子节点数(childCount = childNode.ChildNodes.Count;)②判断该节点的子节点数是否为0,是的话就移除该节点// 获得TreeView的根节点
TreeNode node = TreeView.Nodes [0];
// 递归方法
traverse ( node );
 
    ///<summary>
    ///递归移除所有选中的节点
    ///</summary>
    ///<param name="parentNode"></param>
    private void traverse ( TreeNode parentNode )
    {
        int count = parentNode.ChildNodes.Count;
        for ( int i = 0 ; i < count ; i++ )
        {
            TreeNode childNode = parentNode.ChildNodes [i];
            // 移除之前的子节点数
            int childCount = childNode.ChildNodes.Count;
            // 移除算法
            if ( childCount > 0 )
            {
                // 递归调用
                traverse ( childNode );
                // 移除之后剩余的子节点
                childCount = childNode.ChildNodes.Count;
            }
            else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )
            {
                // 您要做的其他操作
 
                // 移除被选中的节点
                parentNode.ChildNodes.Remove ( childNode );
                --count;
                --i;
            }
 
            // 移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)
            if ( childCount == 0  )
            {
                parentNode.ChildNodes.Remove ( childNode );
                --count;
                --i;
            }
        }
 }

解决方案 »

  1.   

    这里( childNode.ChildNodes.Count == 0 && childNode.Checked )为什么要check?不是你点击一个节点,然后那个节点就是checked为true,其他都是false?难道每个节点的checked会移动变化?  
              
      

  2.   

    1.本程序的功能是删除所选中的节点子节点吧,貌似我测试了删除时所选择的节点没删掉,是删他的子节点。
    2.还有下面两段代码是不是重复的,为啥我觉得else if完全可以删掉
      else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )
                {
                    // 您要做的其他操作
     
                    // 移除被选中的节点
                    parentNode.ChildNodes.Remove ( childNode );
                    --count;
                    --i;
                }
     
                // 移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)
                if ( childCount == 0  )
                {
                    parentNode.ChildNodes.Remove ( childNode );
                    --count;
                    --i;
                }