注意:是同时实现,单独实现已不是问题!
 
功能一:选中父节点的Checkbox,所有子节点一起被选中(递归每个子节点的子节点);取消选中父节点,同样所有子节点也一起被取消选中(递归)。
功能二:改变子节点的状态的时候判断,如果所有同级子节点都已经被选中,则上级父接点也要改成被选中状态;如果同级子节点都为取消选中状态,则上级父节点要变成取消选中状态。(这里应该也有个递归的问题)两个都有递归,而且互相触发,所以搞不定了,希望高手指点一下,最好有关键的代码片段。

解决方案 »

  1.   

    你可以到http://www.codeproject.com/cs/miscctrl/
    下载TriStateTreeView.zip里面有dll和代码,如果下载不到,你可以留个信箱地址,我发给你一个,这个整体效果不错
      

  2.   

    可以popo,[email protected]找我,我发给你一个
      

  3.   

    private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
            {
                ChangeSelected(e.Node);            if(e.Action == System.Windows.Forms.TreeViewAction.ByMouse)
                    SelectedChanged(e.Node);
            }
            
            private void ChangeSelected(TreeNode node)
            {
                foreach(TreeNode tmp in node.Nodes)
                    tmp.Checked = node.Checked;
            }
           
            private void SelectedChanged(TreeNode node)
            {
                
                System.Windows.Forms.TreeNodeCollection nodes = null;
                if(node.Parent == null)
                    nodes = node.TreeView.Nodes;
                else
                    nodes = node.Parent.Nodes;            int i = 0;
                foreach(TreeNode tmp in nodes)
                    if(tmp.Checked) i++;            this.textBox1.Text = i.ToString();
                if((i==nodes.Count) && ((node.Parent!=null)))
                {
                    ((TreeNode)node.Parent).Checked = true;
                    SelectedChanged((TreeNode)node.Parent);
                }
                else if((i==0) & ((node.Parent!=null)))
                {
                    ((TreeNode)node.Parent).Checked = false;
                    SelectedChanged((TreeNode)node.Parent);
                }
            }
      

  4.   

    其实难点就在于treeView1_AfterCheck事件,它无论是手动设置选中还是代码设置选中都会触发,这导致了死循环,然而我们可以判断,if(e.Action == System.Windows.Forms.TreeViewAction.ByMouse)这句是关键,当代码更改CheckBox选中状态时,e.Action的值是e.Action == System.Windows.Forms.TreeViewAction.Unknown 
      

  5.   

    to Eddie005(♂) 暴赱 『零零伍』(︶︵︶) :
       刚刚开会定了一个新功能,就是树上某些分支有Checkbox,某些分支没有,也就是说要实现动态加载某节点的时候来决定这个节点是否有Checkbox,有没有过啊
      

  6.   

    to liujiwe79(独孤求胜) :
       没收到。
      

  7.   

    to 刚刚开会定了一个新功能,就是树上某些分支有Checkbox,某些分支没有,也就是说要实现动态加载某节点的时候来决定这个节点是否有Checkbox,有没有过啊你可以用Icon来代替Checkbox,即用图形来模拟Checkbox的选中和非选中还有Eddie005的方法只是判断了是由Mouse触发,那么在按键触发的时候,会出现死机问题,即判断要稍做改动,参看
    http://blog.csdn.net/knight94/archive/2006/04/10/657658.aspx
      

  8.   

    http://community.csdn.net/Expert/topic/4755/4755939.xml?temp=7.181948E-02to Knight94(愚翁) :
       在codeproject上到是可以找到一个比较复杂的例子,是用图片来模拟了Checkbox的功能,但是那样就没有给每个节点再增加自定义图片的功能了!哎,怎么办呢?
      

  9.   

    to 在codeproject上到是可以找到一个比较复杂的例子,是用图片来模拟了Checkbox的功能,但是那样就没有给每个节点再增加自定义图片的功能了!哎,怎么办呢?那你只能找别人写好的第三方com了,或者你自己去写。
      

  10.   

    ComponentArt 的TreeView能完美的实现你的功能!