首页 > 其他分享 >DXP TreeList 目录树

DXP TreeList 目录树

时间:2023-08-04 09:11:05浏览次数:38  
标签:拖动 object 目录 var treeList TreeList DXP 节点

DXP TreeList 目录树

1.需求背景

需要一个支持勾选拖动节点保存各节点顺序的目录树。

image

2.创建目录树

treeList控件中添加两个colunm 用来显示绑定数据显示值。

image

接下来对treeList的属性进行设置

            // 设置列不显示
            treeList.OptionsView.ShowColumns = false;
            // 设置序号列不显示
            treeList.OptionsView.ShowIndicator = false;
            // 设置垂直线不显示
            treeList.OptionsView.ShowVertLines = false;
            // 设置水平线不显示
            treeList.OptionsView.ShowHorzLines = false;
            // 设置焦点框为行焦点
            treeList.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.RowFocus;
            // 隐藏第一列(数据列)
            treeListColumn1.Visible = false;
            // 设置不可编辑
            treeList.OptionsBehavior.Editable = false;
            // 设置显示复选框
            treeList.OptionsView.ShowCheckBoxes = true;
            // 设置勾选父节点,子节点自动全选
            treeList.OptionsBehavior.AllowRecursiveNodeChecking = true;


添加节点

        private TreeListNode AppendNode(PrjTableNode node, int pid)
        {
            TreeListNode treeListNode = null;
            Action<PrjTableNode, int> ac = (arg1, arg2) =>
             {
                 treeListNode = treeList.AppendNode(new object[] { node, node.Alias }, pid, 0, 0, 0);
             };
            var tt = treeList.Invoke(ac, new object[] { node, pid });
            SetNodeCheckState(treeListNode);
            return treeListNode;
        }

主要用到treeList.AppendNode()方法,方法定义如下

 AppendNode(object nodeData, int parentNodeId, int imageIndex, int selectImageIndex, int stateImageIndex)
  • nodeData : object 类型的参数,这里传入object[]数组对象,数组对应treeList的列,这里第一列是数据,第二列用来显示,因此需要将第一列隐藏。
  • parentNodeId :父节点ID
  • imageIndex : 节点图标索引,这里没有图标就给任意一个数字
  • selectImageIndex : 节点被选择后显示的图标索引
  • stateImageIndex : 状态图标索引

此时目录树就创建好了。

2.1 设置目录树选中节点的背景色

添加CustomDrawNodeCell事件

            // 设置行背景色
            treeList.CustomDrawNodeCell -= TreeList_CustomDrawNodeCell;
            treeList.CustomDrawNodeCell += TreeList_CustomDrawNodeCell;

设置颜色

        private void TreeList_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
        {
            if (e.Node.Selected)
            {
                e.Appearance.BackColor = Color.FromArgb(192, 192, 255);
            }
        }

2.2 控制目录树节点的勾选框是否显示

添加CustomDrawNodeCheckBox事件

            // 控制复选框显隐
            treeList.CustomDrawNodeCheckBox -= TreeList_CustomDrawNodeCheckBox;
            treeList.CustomDrawNodeCheckBox += TreeList_CustomDrawNodeCheckBox;
        private void TreeList_CustomDrawNodeCheckBox(object sender, DevExpress.XtraTreeList.CustomDrawNodeCheckBoxEventArgs e)
        {
            // 满足逻辑条件的 ,将 e.Handled = true 即可
            if ((e.Node.GetValue(treeListColumn1) as PrjTableNode)?.Type == ConstClass1.PRJ_TYPE_ID)
            {
                //e.Handled = true;
            }
        }

2.3 节点拖拽

这里的需求是只允许同级节点内部拖动,也不允许拖动到节点子集。

设置属性OptionsDragAndDrop.DragNodesMode = DragNodesMode.Single

添加DragOver,DragDropAfterDragNode事件

            // 设置节点拖拽
            treeList.OptionsDragAndDrop.DragNodesMode = DragNodesMode.Single;
		   // 处理拖动时的逻辑 
            treeList.DragOver -= TreeList_DragOver;
            treeList.DragOver += TreeList_DragOver;
		   // 处理拖动结束时的逻辑 
            treeList.DragDrop -= TreeList_DragDrop;
            treeList.DragDrop += TreeList_DragDrop;
		   // 处理拖动后的逻辑 
            treeList.AfterDragNode -= TreeList_AfterDragNode;
            treeList.AfterDragNode += TreeList_AfterDragNode;

DragOver 用来处理拖动时的逻辑

当有节点需要禁止拖动时,满足逻辑时,设置 e.Effect = DragDropEffects.None;即可

       private void TreeList_DragOver(object sender, DragEventArgs e)
        {
            var currNode = treeList.FocusedNode;
            var curNodeData = currNode.GetValue(treeListColumn1) as PrjTableNode;
            if (curNodeData == null)
            {
                return;
            }
            if (!curNodeData.CanDrag)
            {
                e.Effect = DragDropEffects.None;
            }
        }

DragDrop 用来处理拖动结束时的逻辑

        private void TreeList_DragDrop(object sender, DragEventArgs e)
        {
            // 当前节点的父节点变化,则不允许拖动
            var dragNode = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
            var sourceParent = dragNode.ParentNode.GetValue(treeListColumn1) as PrjTableNode;

            var targetNode = treeList.CalcHitInfo(treeList.PointToClient(MousePosition)).Node;
            if (targetNode == null)
            {
                return;
            }
            PrjTableNode targetNodeParent = null;
            if (targetNode.ParentNode != null)
            {
                targetNodeParent = targetNode.ParentNode.GetValue(treeListColumn1) as PrjTableNode;
            }
            // 发生跨级移动
            if (sourceParent.Id != targetNodeParent.Id)
            {
                e.Effect = DragDropEffects.None;
                return;
            }
            // 移到子集
            if (AjustDirection(sender, e) == DragInsertPosition.AsChild)
            {
                e.Effect = DragDropEffects.None;
                return;
            }
        }
        /// <summary>
        /// 移动过程中的方向
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        private DragInsertPosition AjustDirection(object sender, DragEventArgs e)
        {
            var tl = sender as TreeList;
            //var dragNode = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
            //var hit = tl.CalcHitInfo(tl.PointToClient(new Point(e.X, e.Y)));
            var pi = typeof(TreeList).GetProperty("Handler", BindingFlags.Instance | BindingFlags.NonPublic);
            var handler = (TreeListHandler)pi.GetValue(tl, null);
            return handler.StateData.DragInfo.DragInsertPosition;

        }

AfterDragNode 用来处理拖动结束后的逻辑

        private void TreeList_AfterDragNode(object sender, AfterDragNodeEventArgs e)
        {
            // TODO:...

        }

3.总结

treeList是一个很强大的控件,用来处理树状结构。本次需求中,处理节点拖拽话费了较长时间,也网上找了很多博文,但是都没有直接解决我的问题,因此在这里做个笔记。

后记:纸上得来终觉浅,绝知此事要躬行

标签:拖动,object,目录,var,treeList,TreeList,DXP,节点
From: https://www.cnblogs.com/ycit/p/17604994.html

相关文章

  • excel递归读取目录并输出
    添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> ......
  • hive建表以\t分割,直接put文件到表目录下进行查询
    建表语句CREATEexternalTABLE`login_number`(serial_numberstring)ROWFORMATSERDE'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'WITHSERDEPROPERTIES('field.delim'='\t','serialization.format'='\t�......
  • Pycharm配置less编译生成的css文件到指定目录
    一、当前演示项目目录二、标记less文件夹为资源目录不标记其实也不影响三、打开FileWatchers(文件监视器)在主菜单中选择"File"(文件)>"Settings"(设置)(Windows/Linux)或"PyCharm"(Windows)/"Preferences"(Mac)或者使用快捷键"Ctrl+Alt+S"(Windows/Linux)或&qu......
  • 1.【linux】 下根目录,家目录区别
    1.【linux】下根目录,家目录区别家目录是在根目录里面。1.家目录一般普通用户,家目录是/home/用户名root用户,家目录是/rootroot登录系统,执行如下命令进入root的家目录cd/cd~进入家目录后执行如下命令获取具体路径pwd2.用户切换1.暂时的(root权限)①需要使用root权限......
  • linux中 文件和目录权限
    在Linux/Unix系统中,每个文件和目录都有权限,权限控制着谁可以对文件或目录进行何种操作。Linux/Unix系统中的文件和目录权限是通过一组三位八进制数来表示的,也称为“权限位”或“权限模式”。每个文件和目录的权限位由三个部分组成,分别表示文件所有者的权限、所属组的权限和其......
  • MAC设置使用命令行通过vs code打开目录
    未设置之前,我们需要先打开vscode,然后再command+o打开对应目录或文件,设置之后,就可以使用命令行直接打开目录或文件设置方式:打开vscode,shift+command+p打开命令面板输入shell,选择“在PATH中安装code命令”确认即可然后就可以通过命令行打开目录啦code.......
  • C和C++进阶的学习笔记总结目录
    C语言–C语言基础知识积累记录学习教程:参考C++教程网之跟我一起学Cdo{…}while(0)的用途汇总(欢迎补充)在一些Linux内核和其它的开源代码中可见到【C语言】《带你学C带你飞》,笔记:链接––C++–一张图总结GoogleC++编程规范(GoogleC++StyleGuide)C++基础学习目录总结参考:链......
  • Java编程-目录整理、新建接口、集成mybatis plus以及数据库初始化
    数据库初始化新建对应调试库```#dockerps#dockerexec-it6d542566d077/bin/bashpostgres=#createdatabasenovel;```执行全量脚本......
  • linux /sys/class/dmi/id目录详解
    /sys/class/dmi/id是一个linux系统的目录,用于存储有关计算机硬件的DMI(desktopmanagementinterface)信息。DMI是一种由系统固件提供的标准接口,收集和报告有关计算机硬件配置的信息/sys/class/dmi/id目录下,可以找到以下文件和子目录bios_date:存储计算机的BIOS固件版本的发布日......
  • compact:这是用于压缩文件和目录的Windows命令。它允许你在磁盘上节省空间,通过将文件和
    compact命令选项外,Windows操作系统中还有一些其他的compact命令选项,如下所示:compact/c:该选项用于强制压缩文件,即使它们已经被压缩过。它会覆盖现有的压缩设置。compact/i:此选项用于仅压缩文件中的空闲空间。它可以用于在磁盘上释放未使用的空间。compact/f:这个选项用于强制......