C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
2010-12-13 01:26 通用C#系统架构 阅读(6196) 评论(14) 编辑 收藏 举报应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户体验也会不太爽,下面就以通用权限管理系统组件源码中的组织机构(部门)管理模块为例子,讲解一下树型结构TreeView节点拖拽的简单功能实现。
其实组织机构管理模块平时不怎么用到拖拽功能,但是往往在数据初始化时为了实现快速输入数据及进行整理调整数据时,往往就非常迫切需要一个灵活的组织机构管理器,当每到年底或者公司进行大的人事调整时也会遇到后台管理员迫切需要拖拽功能的需求,平时组织机构不会有大变动。
软件功能是否好用,往往是体现在最需要折腾数据时是否好用?养兵千日用兵一时,一般没经过磨难的新开发的软件往往会想得不够周到,关键时刻容易掉链子,经不起客户的折腾。
例子程序运行效果如何下:
当然在节点拖拽时,需要注意几个事情:
1:拖拽时总需要有提示信息比较好,防止误操作后找不到被托摘到哪里去了。
2:父亲节点总不能拖拽到自己的子节点上,那不是死循环或者乱了辈份了不是?
为了让TreeView支持拖拽功能,需要注意以下几个属性设置及相应的事件代码。
代码实现参考如下:
{
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();
}
}
}
不足之处,希望大家都指点多留言,有错就积极改进,虽然博客园到处是高手,但是我们普通老百姓也往往需要一些实实在在的基础功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)