树控件

本文介绍了一个自定义的树形控件实现,该控件支持显示复选框,并实现了全选与子节点勾选联动的功能。通过加载特定的数据源,可以构建出具有层级关系的树形结构。
public partial class TreeViewControl : UserControl
    {
        public TreeViewControl()
        {
            InitializeComponent();
        }


        public bool IsShowCheckBox
        {
            set
            {
                this.treeView1.CheckBoxes = value;
            }
            get
            {
                return this.treeView1.CheckBoxes;
            }
        }
        /// <summary>
        /// 加载树
        /// </summary>
        /// <param name="source">数据源</param>
        public void LoadTree(List<TreeViewEntity> source)
        {
            if (source == null || source.Count == 0)
                return;


            treeView1.Nodes.Clear();
            List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == "root").ToList();
            string _root = "";
            if (_roots.Count == 0)
            {
                throw new Exception("没有找到相应根节点,根节点的ParentNodeText值应为root");
            }
            else
            {
                _root = _roots[0].NodeText;
            }


            TreeNode root = new TreeNode(_root);
            root.Expand();
            treeView1.Nodes.Add(root);
            AddChildNodes(source, root);
        }
        private void AddChildNodes(List<TreeViewEntity> source, TreeNode node)
        {
            TreeNode _node;
            List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == node.Text).ToList();
            foreach (TreeViewEntity item in _roots)
            {
                _node = new TreeNode(item.NodeText);
                node.Nodes.Add(_node);
                AddChildNodes(source, _node);
            }
        }
        
        #region 联动事件
        /// 全选事件
        /// <summary>
        /// 全选事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (IsShowCheckBox == false)
                return;


            this.Cursor = Cursors.WaitCursor;
            CheckChildNodes(e.Node, e.Node.Checked);
            this.Cursor = Cursors.Default;
        }
        /// 勾选子节点
        /// <summary>
        /// 勾选子节点
        /// </summary>
        /// <param name="node"></param>
        /// <param name="isChecked"></param>
        private void CheckChildNodes(TreeNode node, bool isChecked)
        {
            node.Checked = isChecked;
            if (node.Nodes.Count > 0)
            {
                foreach (TreeNode item in node.Nodes)
                {
                    CheckChildNodes(item, isChecked);
                }
            }
        }
        /// 子联动父事件
        /// <summary>
        /// 子联动父事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (IsShowCheckBox == false)
                return;


            this.Cursor = Cursors.WaitCursor;
            if (e.Node.Checked)
            {
                CheckParentNode(e.Node);
            }
            else
            {
                UncheckParentNode(e.Node);
            }
            this.Cursor = Cursors.Default;
        }
        /// 勾选父节点
        /// <summary>
        /// 勾选父节点
        /// </summary>
        /// <param name="node"></param>
        private void CheckParentNode(TreeNode node)
        {
            if (node.Parent != null)
            {
                node.Parent.Checked = true;
                CheckParentNode(node.Parent);
            }
        }
        /// 取消父节点勾选
        /// <summary>
        /// 取消父节点勾选
        /// </summary>
        /// <param name="node"></param>
        private void UncheckParentNode(TreeNode node)
        {
            if (node.Parent != null)
            {
                if (CheckChildNodesStatus(node.Parent))
                {
                    node.Parent.Checked = false;
                    UncheckParentNode(node.Parent);
                }
            }
        }
        /// 获取子节点状态
        /// <summary>
        /// 获取子节点状态
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private bool CheckChildNodesStatus(TreeNode node)
        {
            foreach (TreeNode item in node.Nodes)
            {
                if (item.Checked == true)
                    return false;
            }
            return true;
        }
        #endregion
    }
    public class TreeViewEntity
    {
        public TreeViewEntity(string parentNodeText, string nodeText)
        {
            ParentNodeText = parentNodeText;
            NodeText = nodeText;
        }
        /// <summary>
        /// 父节点,如果当前节点已经为父节点,则赋值为"root"
        /// </summary>
        public string ParentNodeText { set; get; }
        /// <summary>
        /// 当前节点
        /// </summary>
        public string NodeText { set; get; }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值