TreeView控件的CheckBox自动实现父子节点递归选定

C#程序, Frame2.0框架。

基于TreeView控件的CheckBox。

实现功能:根据复选节点的平级节点情况修改父级节点情况并递归修改上一级父节点的复选情况;根据须复选节点的复选情况,自动修改子节点以及下一级子节点的复选情况。以下为代码原文(已生成控件,如要使用,直接继承即可)

算法原理:简单的递归,当存在父节点(子节点)的时候,递归调用本身进行判断。

作者的话:很简单的小功能,作为个人工作的备忘,也希望对看到的人能有一点帮助。谢谢你的阅读。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace TreeView_CheckBox_Examply
{
    public partial class TreeView_AutoCheckBox : TreeView
    {
        public TreeView_AutoCheckBox()
        {
            InitializeComponent();
        }

        /// 
        /// 只判断来自鼠标的命令,而不会和自动修改的状态修改命令混淆,而造成死循环
        /// 
        /// 
        protected override void OnAfterCheck(TreeViewEventArgs e)
        {
            base.OnAfterCheck(e);
            if (e.Action == TreeViewAction.ByMouse)
            {
                ChangeSubNodeCheckState(e.Node);
                ChangeParentNodeCheckState(e.Node);
            }
        }

        /// 
        /// 当被复选的节点存在父节点的情况下,根据该节点的同级节点情况,
        /// 决定是否改写父节点状态,同时递归向上判断父节点的父节点。
        /// 
        /// 
        private void ChangeParentNodeCheckState(TreeNode e)
        {
            if (e.Parent != null)
            {
                switch (e.Checked)
                {
                    case true:
                        bool childAllChecked = true;

                        foreach (TreeNode pTreeNode in e.Parent.Nodes)
                        {
                            if (pTreeNode.Checked == false)
                                childAllChecked = false;
                        }

                        if (childAllChecked)
                        {
                            e.Parent.Checked = true;
                            ChangeParentNodeCheckState(e.Parent);
                        }
                        break;
                    case false:
                        e.Parent.Checked = false;
                        ChangeParentNodeCheckState(e.Parent);
                        break;
                    default:
                        break;
                }
            }
        }

        /// 
        /// 当复选的节点存在子节点的情况下,根据复选的节点的复选状态属性修改下级节点状态,
        /// 如果下级节点还存在下级节点,递归修改。
        /// 
        /// 
        private void ChangeSubNodeCheckState(TreeNode e)
        {
            if (e.Nodes != null)
            {
                foreach (TreeNode cTreedNode in e.Nodes)
                {
                    if (e.Checked == true)
                    {
                        cTreedNode.Checked = true;
                        ChangeSubNodeCheckState(cTreedNode);
                    }
                    else
                    {
                        cTreedNode.Checked = false;
                        ChangeSubNodeCheckState(cTreedNode);
                    }
                }
            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值