网上这个方法有个问题点击太快的时候就乱了,有时能选中,有时选不中,有什么好的方法吗
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }       private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
 
         {
 
             if (e.Action == TreeViewAction.ByMouse)
 
             {
 
                 if (e.Node.Checked)
 
                 {
 
                     //取消节点选中状态之后,取消所有父节点的选中状态
 
                     setChildNodeCheckedState(e.Node, true);
 
                   
 
                 }
 
                 else
 
                 {
 
                     //取消节点选中状态之后,取消所有父节点的选中状态
 
                     setChildNodeCheckedState(e.Node, false);
 
                     //如果节点存在父节点,取消父节点的选中状态
 
                     if (e.Node.Parent != null)
 
                     {
 
                         setParentNodeCheckedState(e.Node, false);
 
                     }                  }
 
             }
 
         }
 
         //取消节点选中状态之后,取消所有父节点的选中状态
 
         private void setParentNodeCheckedState(TreeNode currNode, bool state)
 
         {
 
             TreeNode parentNode = currNode.Parent;
 
            
 
                 parentNode.Checked = state;
 
                 if (currNode.Parent.Parent != null)
 
                 {
 
                     setParentNodeCheckedState(currNode.Parent, state);
 
                 }
 
         }
 
         //选中节点之后,选中节点的所有子节点
 
         private void setChildNodeCheckedState(TreeNode currNode, bool state)
 
         {
 
             TreeNodeCollection nodes=currNode.Nodes;
 
             if(nodes.Count>0)
 
             foreach (TreeNode tn in nodes)
 
             {
 
                
 
                 tn.Checked = state;
 
                 setChildNodeCheckedState(tn, state);
 
             }
 
         }
 
     }
}

解决方案 »

  1.   


            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                if (e.Node.Nodes.Count > 0)
                {
                    foreach (TreeNode node in e.Node.Nodes)
                    {
                        node.Checked = e.Node.Checked;
                        treeView1_AfterCheck(sender, new TreeViewEventArgs(node));
                    }
                }
            }
      

  2.   

    是不是双击事件中断了AfterCheck
      

  3.   

    双击Node的checkbox不会触发treeView1_AfterCheck但是节点会被勾选上;