书上的例子,做的时候却发生了奇怪的问题。代码片段: private void tvwSource_AfterCheck(object sender, TreeViewEventArgs e)
        {
            SetCheck(e.Node, e.Node.Checked);
        } private void SetCheck(TreeNode node, bool check)
        {   
            node.Checked = check;
        }说明:程序的目的是显示硬盘目录结构,实现勾选盘符时盘符下的所有文件夹及文件也被选中。显示目录结构已经实现。tvwSource_AfterCheck 是自定义事件方法,这个方法再ide中已经和treeviwe的 aftercheck 绑定。我步进的时候发现 执行完 node.Checked = check;后会返回到SetCheck.....然后形成了无限循环...百思不得其解...求教

解决方案 »

  1.   

    在SetCheck(TreeNode node, bool check)里设置了node的checked,引发_AfterCheck,当然会死循环.private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                if (e.Action == TreeViewAction.Unknown) 做个判断
                    return;
                SetCheck(e.Node, e.Node.Checked);         }
      

  2.   


            //一个函数就行了
            private void tvwSource_AfterCheck(object sender, TreeViewEventArgs e) 
            { 
                  foreach(TreeNode nodeEach in e.Node.Nodes)
                  {
                       nodeEach.Checked = e.Node.Checked;  
                   } 
            }
    将所有子节点选中,同时子节点会自动再触发这个事件。自动遍历。
    你的错误和2楼说的一样!Up
      

  3.   


    bool canclick=true;
    private void tvwSource_AfterCheck(object sender, TreeViewEventArgs e) 
    {
       if(canclick)
    SetCheck(e.Node, e.Node.Checked); 
    canclik=true;
    } private void SetCheck(TreeNode node, bool check) 
            {  
        canclick=false;
                node.Checked = check; 
            } 
      

  4.   

    node.Checked = check; 
    这句会触发 tvwSource_AfterCheck事件 
      

  5.   

    这样写确实能实现,不过有个小遐思,快速连续点击“c:\”前的复选框时会出现bug,出现勾选了 “c:\”而子节点没有被选中,或未勾选中“c:\”而子节点全部被选中。请问这个问题怎么完美解决呢。
      

  6.   

    这个我正好最近用到了:
    在AfterCheck事件中判断是鼠标键盘操作导致选中,还是编码导致改变的。记下节点的深度。然后分别向上、向下递归。实际我是重写了TreeView,定义了一个属性:ClickedLevel记录鼠标键盘操作的节点深度。