C# 中TreeView 控件实现点击CheckBoX自动打钩的事件

来源:互联网 发布:东莞seo顾问 编辑:程序博客网 时间:2024/06/10 11:09

自己想要做一个TreeView,点击节点的CheckBox能让其子节点及父节点做出相应的事件。

也不知道是不是自己的搜索方式不对,只能找到个近似的框架,通过自己修改以达到自己的要求。

现将自己的需求及代码贴上,希望能对有类似需求的同学们有帮助~~

 

要求:

1.父节点勾选,则子节点全部勾选;

2.父节点不勾选,则子节点全部不勾选;

3.子节点部分勾选,则父节点不勾选;

4.子节点全部勾选,则父节点被勾选;

 

就是这么一个简单的功能,自己改了1~2天,才把原先的一些问题解决,现在应该是能满足以上要求了~

 

    #region check选择事件

        private bool nextCheck(TreeNode n)   //判断同级的节点是否全选
        {
            foreach (TreeNode tn in n.Parent.Nodes)
            {
                if (tn.Checked == false)  return false;              
            }
            return true;
        }

        private bool nextNotCheck(TreeNode n)  //判断同级的节点是否全不选
        {
            if (n.Checked == true)
            {
                return false;
            }
            if(n.NextNode==null)
            {
                return true;
            }

            return this.nextNotCheck(n.NextNode);
        }

        private void cycleChild(TreeNode tn,bool check)    //遍历节点下的子节点
        {
            if (tn.Nodes.Count != 0)
            {
                foreach (TreeNode child in tn.Nodes)
                {
                    child.Checked = check;
                    if (child.Nodes.Count != 0)
                    {
                        cycleChild(child, check);
                    }
                }
            }
            else
                return;
        }

        private void cycleParent(TreeNode tn, bool check)    //遍历节点上的父节点
        {
            if (tn.Parent!=null)
            {
                if (nextCheck(tn))
                {
                    tn.Parent.Checked = true;
                }
                else
                {
                    tn.Parent.Checked = false;
                }
                cycleParent(tn.Parent, check);
            }
            return;
        }

        //     afterCheck
        private void treeViewTest_AfterCheck(object sender, TreeViewEventArgs e)    //当选中或取消选中树节点上的复选框时发生
        {
            //要求父节点被勾选,则子节点全部被勾选;父节点不被勾选,则子节点不全不被勾选
                if (e.Node.Checked == true)
                {
                    if (e.Action != TreeViewAction.Unknown)
                    {
                        cycleChild(e.Node, true);
                    }
                    if (e.Node.Parent != null)
                    {
                        if (nextCheck(e.Node))
                        {
                            cycleParent(e.Node,true);
                        }
                        else
                        {
                            cycleParent(e.Node, false);
                        }
                    }              
                }

                if (e.Node.Checked == false)
                {
                    if (e.Action != TreeViewAction.Unknown)
                    {
                        cycleChild(e.Node, false);  //中间节点不选中则子节点全部不选中
                        cycleParent(e.Node, false);       //父节点不选中
                    }
                    //bCheck = false;
                }
            return;
        }

        #endregion

 

至于TreeView 中加入CheckBox的话,只要把控件的属性 CheckBoxes改为True 就好了~~

 

代码写得很长,有什么不足的地方,欢迎指正。。。。