1. 程式人生 > >DEV控制元件之TreeList使用

DEV控制元件之TreeList使用

繫結DataTable

直接設定DataSource即可,同時需要設定KeyFieldName和ParentFieldName兩個屬性,好處就是,無需像TreeView一樣去遞迴節點,設定了這兩個屬性自動實現節點繫結。

注意:繫結的欄位名稱區分大小寫

            //簡單繫結
            treeList1.DataSource = Exam_Week.DbHelper.ExecuteDataTable("select * from dc_sysitemsclass");
            //主鍵欄位名稱
            treeList1.KeyFieldName = "ClassID";
            //父級欄位名稱
            treeList1.ParentFieldName = "ParentID";
            //展開所有節點
            treeList1.ExpandAll();

 

效果如下: 

  繫結List

也可以直接繫結List集合,其使用方式不變,但在取得節點資料時稍有不同。

            //序列化json
            string json = JsonConvert.SerializeObject(Exam_Week.DbHelper.ExecuteDataTable("select * from dc_sysitemsclass"));
            //反序列化json
            List<dc_sysitemsclass> list = JsonConvert.DeserializeObject<List<dc_sysitemsclass>>(json);

            //簡單繫結
            treeList1.DataSource = list;
            //主鍵欄位名稱
            treeList1.KeyFieldName = "ClassID";
            //父級欄位名稱
            treeList1.ParentFieldName = "ParentID";
            //展開所有節點
            treeList1.ExpandAll();

 TreeList多列顯示

經測試,如果需要多列顯示,必須通過設計器配置KeyFieleName和ParentFieldName兩個欄位,通過程式碼無效。

可以通過設計介面的Add Column選單,為TreeList新增多列,並繫結相關的欄位,設定列後,TreeList將自動按照新增的列進行顯示;

 配置列標題和繫結的欄位名:

配置後的效果如下:

 

 

常用事件

 

FocusedNodeChanged事件:選擇的節點發生改變時觸發,可以獲取上一個選擇的節點和當前選擇的節點
獲取節點的方法:
上一個節點:e.OldNode
當前節點:e.Node
獲取節點顯示的文字:
GetDisplayText(..)方法,引數:可以傳入TreeList列ID索引(從0開始)或者傳入繫結的欄位名
        /// <summary>
        /// 選擇節點發生改變時觸發
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeList1_FocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
        {
            //上一個選擇的節點
            if(e.OldNode != null)
            {
                //GetDisplayText:獲取節點顯示的文字
                XtraMessageBox.Show($"節點ID:{e.OldNode.Id},節點名稱:{e.OldNode.GetDisplayText(0)}");
            }
            //當前選擇的節點
            if(e.Node != null)
            {
                XtraMessageBox.Show($"節點ID:{e.Node.Id},節點名稱:{e.Node.GetDisplayText(0)}");
            }
        }

AfterFocusNode事件:節點選擇後觸發,可以獲取當前選擇的節點

獲取節點的方法:e.Node

        /// <summary>
        /// 節點選擇後觸發
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeList1_AfterFocusNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
        {
            ///當前選擇的節點
            if (e.Node != null)
            {
                XtraMessageBox.Show($"節點ID:{e.Node.Id},節點名稱:{e.Node.GetDisplayText(0)}");
            }
        }

通過按鈕獲取當前選中行

可以通過GetFocusedDataRow方法或者GetFocusedRow方法獲取當前行,其中,GetFocusedDataRow只適用於資料來源是DataTable的型別;

 

        /// <summary>
        /// 通過按鈕獲取當前行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            //獲取資料來源是DataTable的DataRow,如果資料來源不是DataTable,則此項為空
            DataRow dr = treeList1.GetFocusedDataRow();
            //輸出列資料
            XtraMessageBox.Show(dr["ClassName"].ToString());

            //通過GetFocusedRow方法獲取當前行
            object Obj = treeList1.GetFocusedRow();

            //如果資料來源是DataTable,則可以將Obj轉換為DataRowView物件
            DataRowView drv = Obj as DataRowView;
            //輸出列資料
            XtraMessageBox.Show(drv["ClassName"].ToString());

            //如果資料是List泛型,則可以將Obj轉換為對應的實體
            dc_sysitemsclass model = Obj as dc_sysitemsclass;
            //輸出列資料
            XtraMessageBox.Show(model.ClassName);
        }

 

 

 

遍歷

 可以通過foreach對TreeList節點進行遍歷,其中的每一項是一個TreeNode。

            //遍歷節點
            foreach (TreeListNode item in treeList1.Nodes)
            {
                XtraMessageBox.Show($"節點ID:{item.Id},節點名稱:{item.GetDisplayText(0)}");
            }

&n