天天看點

DevExpress.XtraTreeList

在最近的工作中,使用到了DevExpress中的XtraTreeList用法,正好借此機會研究一下此控件的應用,現将其應用技巧與大家分享一下。

1、使用XtraTreeList綁定資料(資料格式可以為ArrayList形式)

我們執行個體說明要實作下面樣式的窗體:

DevExpress.XtraTreeList

首先,在Run Designer裡面添加兩個列(columns),設定兩列的屬性,其中第一列“名稱”為string格式,FieldName為Name;第二列“選 擇”将ColumnEdit屬性設定為CheckEdit1,FieldName為IsChecked,設定完畢。

其次可以編寫一個類,用來綁定TreeList,針對此TreeList窗體,其類代碼設定如下:

public class TestTreeList

    {

        public TestTreeList()

        {

        }

        //名稱字段變量

        private string m_sName = string.Empty;

        //選擇字段變量

        private bool m_bIsChecked = false;

        //子Node節點ID變量

        private int m_iID = -1;

        //父Node節點ID變量

        private int m_iParentID = -1;

        public int ID

            get

            {

                return m_iID;

            }

            set

            {

                m_iID = value;

        public int ParentID

                return m_iParentID;

                m_iParentID = value;

        public string Name

                return m_sName;

                m_sName = value;

        public bool IsChecked

            get

                return m_bIsChecked;

                m_bIsChecked = value;

}

類構造完成,在FormLoad裡面借助此類對TreeList進行綁定:

  private void Form1_Load(object sender, EventArgs e)

            ArrayList pList = new ArrayList();

            TestTreeList p = new TestTreeList();

            p.Name = "測試1";

            p.IsChecked = true;

            p.ID = 1;

            pList.Add(p);

            TestTreeList q = new TestTreeList();

            q.Name = "測試2";

            q.IsChecked = false;

            q.ParentID = 1;

            q.ID = 2;

            pList.Add(q);

            this.treeList1.DataSource = pList;

            this.treeList1.RefreshDataSource();

這樣就可以構造出一個簡單的TreeList應用方法,程式運作結果可得第一幅圖所示。

2、DevTreeList改變樣式:

如果将TreeList控件改變成如下樣式(同第一幅圖不一樣,将Check控件顯示在節點最前面)。

DevExpress.XtraTreeList

可以直接修改其控件的ShowCheckBoxes屬性即可(其它樣式類似如下)。

DevExpress.XtraTreeList

3、DevTreeList非綁定形式實作:動态加載,建構:

運作樣式如下:

DevExpress.XtraTreeList

實作動态加載的幾個函數實作如下:

/// <summary>

        /// 動态建立TreeList的Column,一列為圖層名,一列為是否統計列Check控件

        /// </summary>

        private void creatTreeListControl()

            DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnLayerName= new DevExpress.XtraTreeList.Columns.TreeListColumn();

            treeListColumnLayerName.Caption = "名稱";

            treeListColumnLayerName.FieldName = "LayerName";

            treeListColumnLayerName.MinWidth = 38;

            treeListColumnLayerName.Name = "treeListColumnLayerName";

            treeListColumnLayerName.Visible = true;

            treeListColumnLayerName.VisibleIndex = 0;

            treeListColumnLayerName.Width = 111;

            DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnStatisticValue=new DevExpress.XtraTreeList.Columns.TreeListColumn();

              treeListColumnStatisticValue.Caption = "統計值";

            treeListColumnStatisticValue.ColumnEdit = this.repositoryItemCheckEdit1;

            treeListColumnStatisticValue.FieldName = "StatisticValue";

            treeListColumnStatisticValue.Name = "treeListColumnStatisticValue";

            treeListColumnStatisticValue.Visible = true;

            treeListColumnStatisticValue.VisibleIndex = 1;

            this.treeListLayerControl.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] {

            treeListColumnLayerName,

            treeListColumnStatisticValue});

            this.treeListLayerControl.Nodes.Clear();

            this.treeListLayerControl.Refresh();

        /// 動态建立TreeList Layer Node節點

        /// <param name="layerName"></param>

        /// <param name="check"></param>

        private void creatMainLayerNode(string layerName,bool check)

            this.treeListLayerControl.BeginUnboundLoad();

            this.treeListLayerControl.AppendNode(new object[] {  layerName,check}, -1);

            this.treeListLayerControl.EndUnboundLoad();

    /// <summary>

        /// 動态建立TreeList 字段屬性值 Node節點

        /// <param name="ValueName"></param>

        /// <param name="ID"></param>

        private void CreatChildNode(string ValueName, bool check,int ID)

            this.treeListLayerControl.AppendNode(new object[] { ValueName, check }, ID);

  /// <summary>

        /// 獲得圖層名節點的Index值

        /// <param name="ParentNodeName"></param>

        /// <returns></returns>

        private int getParentID(string ParentNodeName)

            int i = -1;

            for (i = 0; i < this.treeListLayerControl.Nodes.Count;i++ )

                if (this.treeListLayerControl.Nodes[i][0].ToString() == ParentNodeName)

                {                 

                    break;

                }

            return i;

        /// 當點選Node事件發生改變(點選主節點時,其子節點跟着主節點變化)

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void treeListLayerControl_CellValueChanging(object sender, DevExpress.XtraTreeList.CellValueChangedEventArgs e)

            if (e.Column.Name.Equals("treeListColumnStatisticValue") && e.Node.HasChildren)

                object objCol = this.treeListLayerControl.Columns[1];

                for (int i = 0; i < e.Node.Nodes.Count; i++)

                {

                    e.Node.Nodes[i].SetValue(objCol, e.Value);

                e.Node.SetValue(objCol, e.Value);

建立子節點方法:

      int indexLayerTree = this.getParentID(playerInfo.LayerName);

                    if (indexLayerTree == -1)

                        return;

                    CreatChildNode(sValue, false, this.treeListLayerControl.Nodes[indexLayerTree].Id);

其建立主節點和建立子節點方法類似,比建立子節點簡單的多。

4、總結