静以修身俭以养德

静以修身俭以养德

绑定DataTable

直接设置DataSource即可,同时需要设置KeyFieldName和ParentFieldName两个属性,好处就是,无需像TreeView一样去递归节点,设置了这两个属性自动实现节点绑定。

注意:绑定的字段名称区分大小写

            //简单绑定
            treeList1.DataSource = Exam_Week.DbHelper.ExecuteDataTable("select * from dc_sysitemsclass");
            //主键字段名称
            treeList1.KeyFieldName = "ClassID";
            //父级字段名称
            treeList1.ParentFieldName = "ParentID";
            //展开所有节点
            treeList1.ExpandAll();

效果如下: 

DEV控件之TreeList使用-LMLPHP

  绑定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将自动按照添加的列进行显示;

DEV控件之TreeList使用-LMLPHP

 配置列标题和绑定的字段名:

DEV控件之TreeList使用-LMLPHP

配置后的效果如下:

DEV控件之TreeList使用-LMLPHP

常用事件

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)}");
            }
06-05 10:27