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)}"); }