场景是在南软智慧医疗医生工作站中的模板树中:
功能为实现拖拽子节点添加到其他节点中删除自身所在位置
首先我们要设置TreeView的AllowDrop熟悉为True,true表示该控件允许接受拖拽
第一步在TreeView中添加事件 ItemDrag
private void treeOpinionTemplate_ItemDrag(object sender, ItemDragEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left)// 获取判断是否是鼠标左键按下操作 ALF { TreeNode node = (TreeNode)e.Item;//获取选定拖拽节点的实例 if (node != null && node.Tag != null && node.Tag.GetType() == typeof(NR.PACS.Common.Entity.Model.OpinionTemplate)) { // 初始化拖放操作。 NR.PACS.Common.Entity.Model.OpinionTemplate mod = (NR.PACS.Common.Entity.Model.OpinionTemplate)node.Tag;//将选择拖动的实例转换成实体数据 alf DoDragDrop(e.Item, DragDropEffects.Move | DragDropEffects.Copy);//mod为拖拽携带数据 } } }
下一步我们将选中TreeView,添加事件 DragEnter
private void treeOpinionTemplate_DragEnter(object sender, DragEventArgs e) { //设置拖动效果为移动 ALF e.Effect = DragDropEffects.Move; }
后面我们继续在TreeView中添加事件 DradDrop
(注:我的业务是在拖拽到的目标必须为标签节点(即分类的不是内容的节点),所以在拖放结束后需要判断该目标位置的节点是内容节点还是标签节点,对应标签节点直接添加进其Nodes,内容节点则添加入上层的Nodes,此处用到区分方法为ImageIndex的值,TreeView创建的节点图片索引不一致,ImageIndex)
private void treeOpinionTemplate_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode",false)) { //被拖拽的节点 TreeNode treeNode; //拖放的目标节点 TreeNode TargetTreeNode; //获取当前鼠标所处的位置,并将它赋值给全局变量point point = ((TreeView)sender).PointToClient(new Point(e.X,e.Y)); //根据坐标点取得坐标点处的Node节点 TargetTreeNode = ((TreeView)sender).GetNodeAt(point); //获取被拖动的节点 treeNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); //判断被拖动的节点与目标节点是否为同一个节点,是则不予处理 if (treeNode.Text != TargetTreeNode.Text) { //判断该目标节点是否为树节点 if (TargetTreeNode.ImageIndex == 0) { //向目标节点加入拖动节点的克隆 TargetTreeNode.Nodes.Add((TreeNode)treeNode.Clone()); } else { //向目标节点加入拖动节点的克隆 TargetTreeNode.Parent.Nodes.Add((TreeNode)treeNode.Clone()); } //移除拖动节点 treeNode.Remove(); } } }
至此我们的功能基本就完成了,其他的可能要根据业务进行修改了