本文摘抄博客园里面的牛人吉日嘎啦。http://www.cnblogs.com/jirigala
例子程序运行效果如何下:
当然在节点拖拽时,需要注意几个事情:
1:拖拽时总需要有提示信息比较好,防止误操作后找不到被托摘到哪里去了。
2:父亲节点总不能拖拽到自己的子节点上,那不是死循环或者乱了辈份了不是?
为了让TreeView支持拖拽功能,需要注意以下几个属性设置及相应的事件代码。
代码实现参考如下:
{
if(this.permissionEdit)
{
//开始进行拖放操作,并将拖放的效果设置成移动。this.DoDragDrop(e.Item,DragDropEffects.Move);
}
}
privatevoidtvOrganize_DragEnter(objectsender,DragEventArgse)
{
//拖动效果设成移动e.Effect=DragDropEffects.Move;
}
privatevoidtvOrganize_DragDrop(objectsender,DragEventArgse)
{
//定义一个中间变量TreeNodetreeNode;
//判断拖动的是否为TreeNode类型,不是的话不予处理if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode",false))
{
//拖放的目标节点TreeNodetargetTreeNode;
//获取当前光标所处的坐标
//定义一个位置点的变量,保存当前光标所处的坐标点Pointpoint=((TreeView)sender).PointToClient(newPoint(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();
}
}
}