您的位置:首页 > 编程语言 > C#

C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

2012-03-18 11:46 746 查看
应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户体验也会不太爽,下面就以通用权限管理系统组件源码中的组织机构(部门)管理模块为例子,讲解一下树型结构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();

}

}

}
复制代码

不足之处,希望大家都指点多留言,有错就积极改进,虽然博客园到处是高手,但是我们普通老百姓也往往需要一些实实在在的基础功能。

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

About



吉日嘎拉(蒙古语为吉祥如意),2000年毕业于黑龙江大学计算机系软件专业,目前定居杭州,典型的IT软件土鳖一个,外号“软件包工头”。

通用权限管理系统组件(GPM - General Permissions Manager)自2003年开始发布,目前是国内注册用户和免费盗版用户最多的权限管理系统,是各种信息管理系统开发中彻底的权限解决方案。本组件支持多种主流数据库(Oracle、sqlsever、db2、mysql),功能强大,使用方便,代码简洁,思路严谨,被广大支持者称为权限管理系统中的“走火入魔级权限管理系统”。

精心维护通用权限管理系统组件(GPM - General Permissions Manager)有8年多,3年的不断推广,20万行经典的业务逻辑积累,经过上万次的调试修正,经历了四百个付费客户,上百软件公司的实战开发。

11年以上开发经验,外企工作5年,上市公司3年,独立经营软件公司2年,主持研发部门管理工作4年以上。

将权限管理、工作流做到我能力的极致,一个人只能做好那么很少的几件事情。



QQ:252056973,Mail:jirigala_bao@hotmail.com

访问者分布


通用权限管理模块的严谨设计定位、精心编码实现、不断维护推广、持续优化改进,主要是为了实现一个可以高度重复利用劳动成果的工具软件并有偿提供给所需的人们,另想成为国人值得骄傲的知名软件功能模块。

可供国内管理类开发人员在日常工作中进行灵活二次开发利用的模块,开发管理类软件的必备工具之一,我们的目标就是让程序员早点儿回家休息。

淘宝店地址:http://jirigala.taobao.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐