我想实现c#中 treeview的节点拖拽功能?

我想实现c#中 treeview的节点拖拽功能?,第1张

private void sdTreeView1_DragDrop(object sender, DragEventArgs e)

{

TreeNode myNode = null

if (e.Data.GetDataPresent(typeof (sdTreeNode)))

{

myNode = (TreeNode)(e.Data.GetData(typeof(sdTreeNode)))

}

else

{

MessageBox.Show("error")

}

Position.X = e.X

Position.Y = e.Y

Position = sdTreeView1.PointToClient(Position)

DropNode = this.sdTreeView1.GetNodeAt(Position)

if (DropNode != null)

DropNode.BackColor = TreeNodeDefaultColor

else

return

// 1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身

TreeNode node = DropNode.Parent

while(node!=null&&node.Level>=0)

{

if (node == myNode)

return

node = node.Parent

}if (DropNode != null &&DropNode.Parent != myNode &&DropNode != myNode)

{

DialogResult dr = MessageBox.Show(this,

"您确定移动此节点?", "移动提示",

MessageBoxButtons.YesNo, MessageBoxIcon.Question)

//中文

if (dr != DialogResult.Yes)

{

return

}

AfterDragNode(myNode, DropNode)

myNode.ExpandAll()

TreeNode DragNode = myNode

// 将被拖拽节点从原来位置删除。

myNode.Remove()

// 在目标节点下增加被拖拽节点

DropNode.Nodes.Add(DragNode)

}

// 如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下

if (DropNode == null)

{

DialogResult dr = MessageBox.Show(this,

"您确定移动此节点?", "移动提示",

MessageBoxButtons.YesNo, MessageBoxIcon.Question)

//中文

if (dr != DialogResult.Yes)

{

return

}

AfterDragNode(myNode, DropNode)

myNode.ExpandAll()

TreeNode DragNode = myNode

myNode.Remove()

sdTreeView1.Nodes.Add(DragNode)

}

}private void sdTreeView1_DragOver(object sender,DragEventArgs e)

{

try

{

sdTreeView1.SelectChangeColor = false

sdTreeView1.SelectedNode = null

if (DropNode != null)

DropNode.BackColor = TreeNodeDefaultColor

Position.X = e.X

Position.Y = e.Y

Position = sdTreeView1.PointToClient(Position)

DropNode = this.sdTreeView1.GetNodeAt(Position)

DropNode.BackColor = Color.HotPink

}

finally

{

sdTreeView1.SelectChangeColor = true

}

}private void sdTreeView1_DragEnter(object sender, DragEventArgs e)

{

if (e.Data.GetDataPresent(typeof(sdTreeNode)))

e.Effect = DragDropEffects.Move

else

e.Effect = DragDropEffects.None /*

Position.X = e.X

Position.Y = e.Y

Position = sdTreeView1.PointToClient(Position)

DropNode = this.sdTreeView1.GetNodeAt(Position)

DropNode.BackColor = Color.IndianRed*/

}

树节点拖拽的好处是使用户更方便地修改脚本。TreeView支持拖拽,用户可以把任意一个节点拖拽到他想要的地方,从而达到修改脚本的目的,用户可以右键单击节点,进行修改或删除当前函数参数属性增加函数等 *** 作,通过TreeView能够增加LoadRunner提供的部分常用通用函数和协议相关函数。

树节点拖拽的特点

TTreeView是VCL里面一个类,也是我们经常会用到的,而且功能也是很强大的,首先要实现OnMouseDown,在其内要写入开启拖动的代码,然后要实现OnDragOver,其主要作用是在拖动过程中,实现对节点拖动目的di的控制,最后要实现OnDragDrop,其是实现拖动释放的 *** 作。

你试一下,新建一个项目,加一个TreeView控件,应该可以运行:

using System

using System.Collections.Generic

using System.ComponentModel

using System.Data

using System.Drawing

using System.Text

using System.Windows.Forms

namespace WindowsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent()

}

private void Form1_Load(object sender, EventArgs e)

{//添加树形视图子节点

this.treeView1.Nodes.AddRange(new TreeNode[] {

new TreeNode("中国直辖市", new TreeNode[] {

new TreeNode("北京市", new TreeNode[] {

new TreeNode("东城区"), new TreeNode("西城区"),new TreeNode("朝阳区")}),

new TreeNode("上海市", new TreeNode[] {new TreeNode("长宁区"),

new TreeNode("黄埔区"), new TreeNode("浦东区")}),

new TreeNode("重庆市", new TreeNode[] {

new TreeNode("长寿区", new TreeNode[] {new TreeNode("云台镇"),

new TreeNode("凤城镇", new TreeNode[] )}),

new TreeNode("渝北区"),new TreeNode("北碚区")})})})

this.treeView1.AllowDrop = true

this.treeView1.ExpandAll()

}

private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)

{ //处理 treeView1控件ItemDrag事件

//设置拖放类型为移动

DoDragDrop(e.Item, DragDropEffects.Move)

}

private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)

{//处理 treeView1控件DragEnter事件

//获取节点的数据内容

object MyData = e.Data.GetData(typeof(TreeNode))

//如果节点有数据,拖放目标允许移动

if (MyData != null)

{

e.Effect = DragDropEffects.Move

}

else

{

e.Effect = DragDropEffects.None

}

TreeView MyTreeView = (TreeView)sender

TreeNode MyNode = MyTreeView.GetNodeAt(treeView1.PointToClient(new Point(e.X, e.Y)))

if (MyNode != null)

{ //改变进入节点的背景色

MyNode.BackColor = Color.Blue

//保存此节点,进入下一个时还原背景色

MyOldNode = MyNode

}

}

private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)

{//处理 treeView1控件DragOver事件

//修改鼠标进入节点的背景色,还原上一个节点的背景色

TreeView MyTreeView = (TreeView)sender

TreeNode MyNode = MyTreeView.GetNodeAt(treeView1.PointToClient(new Point(e.X, e.Y)))

if ((MyNode != null) &&(MyNode != MyOldNode))

{

MyOldNode.BackColor = Color.White

MyNode.BackColor = Color.Blue

MyOldNode = MyNode

}

}

private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)

{//处理 treeView1控件DragDrop事件

TreeNode MyNode = (TreeNode)e.Data.GetData(typeof(TreeNode))

TreeView MyTreeView = (TreeView)sender

//得到当前鼠标进入的节点

TreeNode MyTargetNode = MyTreeView.GetNodeAt(treeView1.PointToClient(new Point(e.X, e.Y)))

if (MyTargetNode != null)

{

TreeNode MyTargetParent = MyTargetNode.Parent

//删除拖放的节点

MyNode.Remove()

//添加到目标节点

MyTargetNode.Nodes.Add(MyNode)

MyTargetNode.BackColor = Color.White

MyTreeView.SelectedNode = MyTargetNode

}

}

//保存前一个鼠标进入的节点

private TreeNode MyOldNode

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11876177.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存