TreeList自帶勾選框實現批量勾選

現在有這麼一個常見的功能需求:樹形控件需要批量勾選,且勾選父節點默認將子節點全部勾上;當子節點全部取消勾選後,父節點的勾選也取消掉;勾選一個子節點,默認就把父節點也置於勾選狀態。

最常見的案例就是windows功能,Dev提供了一個很強大的樹形控件-TreeList,同樣可以實現這些簡單效果。

首先我們要知道TreeList自帶的勾選控件在哪

treelist.OptionsSelection.MultiSelect = True;
treelist.OptionsSelection.UseIndicatorForSelection = True;
treelist.OptionsView.ShowCheckBoxes = True;

設置好這些屬性後,再瞭解一個事件 treelist_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)

簡單理解爲 用戶更改節點的勾選狀態後發生。 當我們勾選其中一個節點後,通過遞歸的方式自下而上或自上而下去尋找父|子節點。

        //勾選|取消勾選 父節點,遞歸處理子節點
        private bool m_SetClick = true; 
        private void SetSubNodeCheck(TreeListNode p_TreeNode, bool p_SelectCheck)
        {
            m_SetClick = false;
            foreach (TreeListNode _SubNode in p_TreeNode.Nodes)
            {
                _SubNode.Checked = p_SelectCheck;
                SetSubNodeCheck(_SubNode, p_SelectCheck);
            }
        }
        //勾選子節點,父節點同樣勾上
        private void SetParentCheck(TreeListNode p_TreeNode)
        {
            if (p_TreeNode.Checked && p_TreeNode.ParentNode != null)
            {
                p_TreeNode.ParentNode.Checked = true;
                SetParentCheck(p_TreeNode.ParentNode);
            }
        }
        //如果當前分支下最後一個勾選的子節點取消勾選,父節點勾選狀態取消
        private void SetParentNotCheck(TreeListNode p_TreeNode)
        {
            if (!p_TreeNode.Checked && p_TreeNode.ParentNode != null)
            {
                foreach (TreeListNode _Node in p_TreeNode.ParentNode.Nodes)
                {
                    if (_Node.Checked) return;
                }
                p_TreeNode.ParentNode.Checked = false;
                SetParentNotCheck(p_TreeNode.ParentNode);
            }
        }
        private void tlBoi_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
        {
            // 禁用TreeView視圖重繪的功能。
            tlDetail.BeginUpdate();
            if (m_SetClick)
            {
                SetSubNodeCheck(e.Node, e.Node.Checked);
                SetParentCheck(e.Node);
                SetParentNotCheck(e.Node);
                m_SetClick = true;
            }
            // 啓用TreeView視圖重繪的功能。
            tlDetail.EndUpdate();
        }

TreeList自帶勾選框批量勾選基本就這麼多東西,當然還有其它方式可以實現批量勾選,比如:增加勾選列,列中關聯checkEdit控件。這裏就不詳細說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章