#region 下移
private void tsmiDownNode_Click(object sender, EventArgs e)
{
TreeNode trNode = treeRegion.SelectedNode;
TreeNode nextNode = trNode.NextNode;
if (nextNode == null) //下一个节点为Null时返回
{
return;
}
TreeNode NewNode = (TreeNode)trNode.Clone();
trNode.Parent.Nodes.Insert(nextNode.Index + 1, NewNode);
trNode.Remove();
treeRegion.SelectedNode = NewNode;
}
#endregion
#region 上移
private void tsmiUpNode_Click(object sender, EventArgs e)
{
TreeNode trNode = treeRegion.SelectedNode;
TreeNode preNode = trNode.PrevNode;
if (preNode == null) //选中节点的上一个节点为Null则返回
{
return;
}
TreeNode NewNode = (TreeNode)trNode.Clone();
trNode.Parent.Nodes.Insert(preNode.Index, NewNode);
trNode.Remove();
treeRegion.SelectedNode = NewNode;
}
#endregion
不保存数据只是移动;如果需要保存到数据库需要自己添加保存数据的代码
//拖动节点上下移动
#region 拖动上下移动节点
//拖动
private void treeRegion_ItemDrag(object sender, ItemDragEventArgs e)//左键拖动
{
if (e.Button == MouseButtons.Left)
{
TreeNode node = treeRegion.SelectedNode;
if (node != null)
{
DoDragDrop(node, DragDropEffects.All);
}
}
}
private void treeRegion_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)) == true)
{
e.Effect = DragDropEffects.All;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void treeRegion_DragDrop(object sender, DragEventArgs e)
{
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
//根据鼠标坐标确定要移动到的目标节点
Point pt;
TreeNode targeNode;
pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
targeNode = this.treeRegion.GetNodeAt(pt);
//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
if (targeNode.Nodes.Count == 0)
{
targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
}
else
{
targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
}
//更新当前拖动的节点选择
treeRegion.SelectedNode = NewMoveNode;
//展开目标节点,便于显示拖放效果
targeNode.Expand();
//移除拖放的节点
moveNode.Remove();
}
#endregion
Demo:
public Form1()
{
InitializeComponent();
CreateTreeView();//构建树
}
private void CreateTreeView()
{
treeView1.Nodes.Add("北京");
treeView1.Nodes[0].Nodes.Add("昌平区");
treeView1.Nodes[0].Nodes.Add("通州区");
treeView1.Nodes[0].Nodes.Add("海淀区");
treeView1.Nodes.Add("河北省");
treeView1.Nodes[1].Nodes.Add("石家庄市");
treeView1.Nodes[1].Nodes.Add("唐山市");
treeView1.Nodes[1].Nodes.Add("廊坊市");
treeView1.Nodes[1].Nodes.Add("保定市");
treeView1.ExpandAll();
}
#region 拖动节点上下移动
private void treeRegion_ItemDrag(object sender, ItemDragEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
}
private void treeRegion_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private Point pt = new Point(0, 0);
private void treeRegion_DragDrop(object sender, DragEventArgs e)
{
#region 添加到目标节点下
/*
TreeNode myNode = null;
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
}
else
{
MessageBox.Show("error");
}
pt.X = e.X;
pt.Y = e.Y;
pt = treeView1.PointToClient(pt);
TreeNode DropNode = this.treeView1.GetNodeAt(pt);
//1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
if (DropNode != null && DropNode.Parent != myNode && DropNode != myNode)
{
TreeNode DragNode = myNode;
// 将被拖拽节点从原来位置删除。
myNode.Remove();
// 在目标节点下增加被拖拽节点
DropNode.Nodes.Add(DragNode);
}
//如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
if (DropNode == null)
{
TreeNode DragNode = myNode;
myNode.Remove();
treeView1.Nodes.Add(DragNode);
}
*/
#endregion
#region 和目标节点替换
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
//根据鼠标坐标确定要移动到的目标节点
TreeNode targeNode;
Point pt;
pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
targeNode = this.treeView1.GetNodeAt(pt);
//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
if (targeNode.Nodes.Count == 0)
{
targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
}
else
{
targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
}
//更新当前拖动的节点选择
treeView1.SelectedNode = NewMoveNode;
//展开目标节点,便于显示拖放效果
targeNode.Expand();
//移除拖放的节点
moveNode.Remove();
#endregion
}
#endregion