博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
阅读量:5889 次
发布时间:2019-06-19

本文共 1954 字,大约阅读时间需要 6 分钟。

应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户体验也会不太爽,下面就以通用权限管理系统组件源码中的组织机构(部门)管理模块为例子,讲解一下树型结构TreeView节点拖拽的简单功能实现。

 

   其实组织机构管理模块平时不怎么用到拖拽功能,但是往往在数据初始化时为了实现快速输入数据及进行整理调整数据时,往往就非常迫切需要一个灵活的组织机构管理器,当每到年底或者公司进行大的人事调整时也会遇到后台管理员迫切需要拖拽功能的需求,平时组织机构不会有大变动。

 

   软件功能是否好用,往往是体现在最需要折腾数据时是否好用?养兵千日用兵一时,一般没经过磨难的新开发的软件往往会想得不够周到,关键时刻容易掉链子,经不起客户的折腾。

 

   例子程序运行效果如何下:

   

   当然在节点拖拽时,需要注意几个事情:

   1:拖拽时总需要有提示信息比较好,防止误操作后找不到被托摘到哪里去了。

   2:父亲节点总不能拖拽到自己的子节点上,那不是死循环或者乱了辈份了不是?

 

   为了让TreeView支持拖拽功能,需要注意以下几个属性设置及相应的事件代码。

   

   

 

    代码实现参考如下:

        
private
 
void
 tvOrganize_ItemDrag(
object
 sender, ItemDragEventArgs e)
        {
            
if
 (
this
.permissionEdit)
            {
                
//
 开始进行拖放操作,并将拖放的效果设置成移动。
                
this
.DoDragDrop(e.Item, DragDropEffects.Move);
            }
        }
        
private
 
void
 tvOrganize_DragEnter(
object
 sender, DragEventArgs e)
        {
            
//
 拖动效果设成移动
            e.Effect 
=
 DragDropEffects.Move;
        }
        
private
 
void
 tvOrganize_DragDrop(
object
 sender, DragEventArgs e)
        {
            
//
 定义一个中间变量
            TreeNode treeNode;
            
//
判断拖动的是否为TreeNode类型,不是的话不予处理
            
if
 (e.Data.GetDataPresent(
"
System.Windows.Forms.TreeNode
"
false
))
            {
                
//
 拖放的目标节点
                TreeNode targetTreeNode;
                
//
 获取当前光标所处的坐标
                
//
 定义一个位置点的变量,保存当前光标所处的坐标点
                Point point 
=
 ((TreeView)sender).PointToClient(
new
 Point(e.X, e.Y));
                
//
 根据坐标点取得处于坐标点位置的节点
                targetTreeNode 
=
 ((TreeView)sender).GetNodeAt(point);
                
//
 获取被拖动的节点
                treeNode 
=
 (TreeNode)e.Data.GetData(
"
System.Windows.Forms.TreeNode
"
);
                
//
 判断拖动的节点与目标节点是否是同一个,同一个不予处理
                
if
 (BaseInterfaceLogic.TreeNodeCanMoveTo(treeNode, targetTreeNode))
                {
                    
if
 (BaseSystemInfo.ShowInformation)
                    {
                        
//
 是否移动部门
                        
if
 (MessageBox.Show(AppMessage.Format(AppMessage.MSG0038, treeNode.Text, targetTreeNode.Text), AppMessage.MSG0000, MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
==
 DialogResult.No)
                        {
                            
return
;
                        }
                    }
                    ServiceManager.Instance.OrganizeService.MoveTo(UserInfo, treeNode.Tag.ToString(), targetTreeNode.Tag.ToString());
                    
//
 往目标节点中加入被拖动节点的一份克隆
                    targetTreeNode.Nodes.Add((TreeNode)treeNode.Clone());
                    
//
 将被拖动的节点移除
                    treeNode.Remove();
                }
            }
        }
本文转自jirigala_bao 51CTO博客,原文链接:http://blog.51cto.com/jirigala/809337

转载地址:http://wdwsx.baihongyu.com/

你可能感兴趣的文章
SQL Denali-FileTable
查看>>
C# 图像处理:复制屏幕到内存中,拷屏操作
查看>>
PHP微信支付流程
查看>>
CF989B A Tide of Riverscape 思维 第七题
查看>>
unix高级环境编程-读书笔记(1)
查看>>
MongoDB学习教程(1)
查看>>
Jquery遮罩ShowLoading组件
查看>>
pivot 使用
查看>>
hdu 1180 诡异的楼梯 BFS + 优先队列
查看>>
hadoop中mapreduce的mapper抽象类和reduce抽象类
查看>>
【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
查看>>
dedecms的安装,request_order的问题
查看>>
vi 颜色配置
查看>>
linux下单节点oracle数据库间ogg搭建
查看>>
PLSQL Developer软件使用大全
查看>>
swift三方库
查看>>
杭州之行
查看>>
oracle ORA-00917: missing comma 是因为少逗号
查看>>
策略模式简介
查看>>
UIViewController中loadView的用法(应当注意的几点)
查看>>