怎样实现TreeView的TreeNode拖动功能,以调整TreeNode的顺序?(C#)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样实现TreeView的TreeNode拖动功能,以调整TreeNode的顺序?(C#)相关的知识,希望对你有一定的参考价值。

最好提供具体的实例。不能是先删除某个结点,然后在指定的位置再插入这个结点来实现调整TreeNOde的顺序

参考技术A 你试一下,新建一个项目,加一个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("关口"))),
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;

本回答被提问者采纳

webform treeview 的点击事件原理

webform treeview 的点击事件原理是什么样的?
页面上放了一个treeview控件,一个gridview控件,已实现通过SelectedNodeChanged的方式,点击treeview1的node给gridview发送选定node的value。用于gridiew显示选定treenode的childenodes。如下:

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)

show_child_structure_Gridview(TreeView1.SelectedNode.Value.ToString());
show_this_structure_Gridview(TreeView1.SelectedNode.Value.ToString());
getTextPath(TreeView1.SelectedNode,TreeView1.SelectedNode.Text);


观察页面情况,在鼠标放在treenode上时,浏览器状态栏显示:
javascript:_doPostBack('Treeview1','s1\\2\\3')
Treeview1是选定treeview的ID,'s1\\2\\3'是选择的treenode的valuepath。

点击treenode后,页面刷新,但是页面的url : default.aspx?id=xxx,并未发生变化。

请问:该过程是的详细原理?

另:若想通过点击gridview空间的行实现类似功能,需如何做?(目前方式是通过RowDataBound,定义一个JS window.open方式,通过url传值)

楼上开始瞎掰了。

url没刷新是因为上一次请求和这次的请求form的action是一样的,你看不出来而已。
__doPostBack是.net的postback机制,通过给一个Id和一个值,TreeView会根据后面的Path来引发响应的事件。你可以看看IPostBackEventHandler的接口,这个涉及到asp.net基础构架的知识。
http://msdn.microsoft.com/zh-cn/library/system.web.ui.ipostbackeventhandler(v=vs.80).aspx

GridView行一般都是加一列,这一列是个Button,点击Button的时候postback回去,基本上不用你写任何代码就可以处理,可以处理RowCommand事件。不过你非要点击行的话,那你需要自己写javascript,当点击行的时候引发PostBack,通过Page.ClientScript.GetPostBackReference可以构建一个这个PostBack语句,扔到页面上row的onclick里面就可以了。追问

我是通过GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 的方式,给行追加的onlick事件
e.Row.Attributes.Add("ondblclick", "window.open('?request_structure_id=" + e.Row.Cells[0].Text + "','_self' )");
请问,按您说的方式,onclick事件该怎么写?

参考技术A _doPostBack的原理是提交form表单,控件中反射调用事件,所以url不会变化

以上是关于怎样实现TreeView的TreeNode拖动功能,以调整TreeNode的顺序?(C#)的主要内容,如果未能解决你的问题,请参考以下文章

WPF TreeView内部拖动项

当用户将鼠标悬停在 TreeView 控件的特定 TreeNode 控件上时显示不同的光标

突出显示被拖动的 TreeView 项目

wpf中的treeview怎样添加图标上去?

DataGridView拖动到TreeView

WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)