DevExpress TreeList控件的復選框


        作者:jiankunking 出處:http://blog.csdn.net/jiankunking

        TreeList控件能夠同一時候顯示樹結構和其它數據列,即在一個列上建立父子關系展開或收縮,同一時候還能夠顯示其它列的內容。
        在TreeList中同一時候引入了 Node和 Columns概念, 第一列為樹結構, 其余列為數據列, 不論什么列都可作為樹結構列(即拖動到第一列)顯示。
實現多級樹---數據源綁定
        在TreeList里加入要顯示列(第一列為樹結構。其它列為數據列),並指定FieldName為數據庫列名
        指定KeyFieldName屬性為主鍵。ParentFieldName屬性為樹狀分組列。注意 ParentFieldName指定的列假設為空值,樹狀可能會混亂(僅僅有一個根結點,其它為此節點的子結點)
        用TreeList.DataSource = DataTable 綁定數據就可以
樹形控件是使用頻率非常高的一種控件。對於屬性控件往往須要以下兩個功能:
        1.TreeList帶有CheckBox,而且節點要有三種狀態(所有的子節點都選中,所有的子節點都沒選擇,一部分子節點選中)。

使用DevXpress的TreeList控件非常easy實現這一功能。
        設置TreeList.OptionsView.ShowCheckBoxes = true //是否顯示CheckBox
        設置TreeList.OptionsBehavior.AllowIndeterminateCheckState = true; //設置節點是否有中間狀態,即一部分子節點選中,一部分子節點沒有選中
設置這兩個屬性之后就實現了TreeList帶有CheckBox,而且節點有三種狀態。


        2.選中父節點或者子節點相互影響的功能,如選擇父節點選擇所有子節點。綁定TreeList的兩個事件AfterCheckNode和BeforeCheckNode
DevExpress的TreeList要想在節點前面顯示復選框,得改動屬性OptionsView->ShowCheckBoxes=True
復選框的子節點與父節點統一的規則有:
        1、選擇某一節點時,該節點的子節點所有選擇
        2、取消某一節點時,該節點的子節點所有取消選擇
        3、某節點的子節點所有選擇時,該節點選擇
        4、某節點的子節點未所有選擇時,該節點不選擇

       #region 節點選中前事件
        private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
        {
            if (e.PrevState == CheckState.Checked)
            {
                e.State = CheckState.Unchecked;
            }
            else
            {
                e.State = CheckState.Checked;
            }
        }
        #endregion

        #region 節點選中后事件
        private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
        {
            SetCheckedChildNodes(e.Node, e.Node.CheckState);
            SetCheckedParentNodes(e.Node, e.Node.CheckState);
        }
        #endregion

        #region 設置子節點狀態
        private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
        {
            for (int i = 0; i < node.Nodes.Count; i++)
            {
                node.Nodes[i].CheckState = check;
                SetCheckedChildNodes(node.Nodes[i], check);
            }
        }
        #endregion

        #region 設置父節點狀態
        private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
        {
            if (node.ParentNode != null)
            {
                bool b = false;
                CheckState state;
                for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
                {
                    state = (CheckState)node.ParentNode.Nodes[i].CheckState;
                    if (!check.Equals(state))
                    {
                        b = !b;
                        break;
                    }
                }
                if (b)
                {
                    node.ParentNode.CheckState = CheckState.Indeterminate;
                }
                else
                {
                    node.ParentNode.CheckState = check;
                }
                SetCheckedParentNodes(node.ParentNode, check);
            }
        }
        #endregion



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM