先介绍下TREE,是多层的,有CHECKBOX,
例TREE
口1--口2.1
    -口2.2--口3.1
           -口3.2
打算实现的功能是:
1、1的CHECKBOX打钩,2、3的全打钩;1取消钩,2、3也全取消;
   2、3部分打钩,1不钩;2、3全钩,1钩;2、3全取消,1取消。
(1已经弄好了,问题在2)
2、TREE字体默认颜色【灰色】。所有打钩的项都变成【黑色】;只要2或3有钩,1就变黑;反则恢复【灰色】。这个主要是用在对一系列任务进行跟踪时,如果主任务里任何一个子任务(包括更下级的子)完成(即打钩变黑),主任务就变黑,表示任务已经展开;都是灰色说明任务还没开始;打钩了说明该任务完成。 下面的语句有3个问题,
1、如果超过2层结构,取消1的钩时主项的字体不变灰;2层以内就可以。
2、如果子项2.2也有子项时,先取消2.1的钩,再把2.2的钩取消掉,1不变灰;
3、如果先取消2.1的钩,然后取消3.1,3.2的钩,虽然子项都没钩了,1也不变灰我找不出应该怎么改,有地方判断出错了,HELP!或者告诉我另外可行的方法 private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
                      {                
                SetNodeCheckStatus(e.Node, e.Node.Checked);
            }
            if (e.Node.Parent != null && e.Node.Nodes.Count == 0)//子节点
            {
                if (nextCheck(e.Node.Parent.FirstNode) == true)//全部勾选
                {
                    e.Node.Parent.ForeColor = Color.Black;                    
                }                else if (nextNotCheck(e.Node.Parent.FirstNode) == true)//全部不勾选
                {
                    e.Node.Parent.ForeColor = Color.Gray;                    
                }
                else
                { 
                    e.Node.Parent.ForeColor = Color.Black;                        
                }
                
                return;
            }
        }
        private void SetNodeCheckStatus(TreeNode tn, bool Checked)
        {
            if (Checked == true)
                tn.ForeColor = Color.Black;            
            if (Checked == false)
                tn.ForeColor = Color.Gray;
            if (tn == null) return;
            // Check children nodes
            foreach (TreeNode tnChild in tn.Nodes)
            {
                tnChild.Checked = Checked;
                SetNodeCheckStatus(tnChild, Checked);               
            }
            // Set parent check status
            TreeNode tnParent = tn;
            int nNodeCount = 0;
            while (tnParent.Parent != null)
            {
                tnParent = (TreeNode)(tnParent.Parent);
                nNodeCount = 0;
                foreach (TreeNode tnTemp in tnParent.Nodes)
                if (tnTemp.Checked == Checked)
                        nNodeCount++;
                if (nNodeCount == tnParent.Nodes.Count)
                    tnParent.Checked = Checked;
                else
                    tnParent.Checked = false;
              
            }
        }
        private bool nextCheck(TreeNode n)//判断同级的节点是否全选
        {
            if (n.Checked == false)
                return false;
            if (n.NextNode == null)
                return true;
            return this.nextCheck(n.NextNode);
        }
        private bool nextNotCheck(TreeNode n)//判断同级的节点是否全不选
        {
            if (n.Checked == true)
                return false;
            if (n.NextNode == null)
                return true;
            return this.nextNotCheck(n.NextNode);
        }

解决方案 »

  1.   

    完成代码:
    private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
            {
                if (e.Action != TreeViewAction.Unknown)
                {
                    SetNodeCheckStatus(e.Node, e.Node.Checked);
                }           
            }        
            private void SetNodeCheckStatus(TreeNode tn, bool Checked)
            {                           
                fnodecolor(tn,Checked);           
                if (tn == null) return;
                // Check children nodes
                foreach (TreeNode tnChild in tn.Nodes)
                {
                    tnChild.Checked = Checked;
                    SetNodeCheckStatus(tnChild, Checked);
                }
                // Set parent check status
                TreeNode tnParent = tn;
                int nNodeCount = 0;
                while (tnParent.Parent != null)
                {
                    tnParent = (TreeNode)(tnParent.Parent);
                    nNodeCount = 0;
                    foreach (TreeNode tnTemp in tnParent.Nodes)
                        if (tnTemp.Checked == Checked)
                            nNodeCount++;
                    if (nNodeCount == tnParent.Nodes.Count)
                        tnParent.Checked = Checked;
                    else
                        tnParent.Checked = false;
                }
            }
            private void fnodecolor(TreeNode pn, bool Checked)
            {
                if (Checked == true)
                {
                    pn.ForeColor = Color.Black;
                    if (pn.Parent != null)
                    {
                        pn.Parent.ForeColor = Color.Black;
                        if (pn.Parent.Parent != null)
                        {
                            fnodecolor(pn.Parent, Checked);
                        }
                    }
                }
                if (Checked == false)
                {
                    pn.ForeColor = Color.Gray;
                    if (pn.Parent != null)
                    {
                        if (nextColor(pn.Parent.FirstNode) == true)
                        {
                            pn.Parent.ForeColor = Color.Gray;
                            if (pn.Parent.Parent != null)
                            {
                                fnodecolor(pn.Parent, Checked);
                            }
                        }
                    }
                }
            }       
            private bool nextColor(TreeNode n)//判断同级的节点颜色是否全灰
            {
                if (n.ForeColor == Color.Black)
                    return false;
                if (n.NextNode == null)
                    return true;
                return this.nextColor(n.NextNode);
            }