c#treeview选择多个节点拖拽移动代码案例
时间: 2023-11-26 15:06:09 浏览: 148
TreeView 带图片及内容的节点拖拽例子
5星 · 资源好评率100%
下面是一个C# TreeView控件选择多个节点拖拽移动的示例代码:
```csharp
private List<TreeNode> selectedNodes = new List<TreeNode>();
private Point mouseDownLocation;
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && ModifierKeys == Keys.Control)
{
//记录用户选择的节点
selectedNodes.Clear();
foreach (TreeNode node in treeView1.SelectedNodes)
{
selectedNodes.Add(node);
}
//记录鼠标按下的位置
mouseDownLocation = e.Location;
}
}
private void treeView1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && selectedNodes.Count > 0)
{
//如果移动了一定的距离,开始拖拽操作
if (Math.Abs(e.X - mouseDownLocation.X) > SystemInformation.DragSize.Width
|| Math.Abs(e.Y - mouseDownLocation.Y) > SystemInformation.DragSize.Height)
{
//开始拖拽操作
treeView1.DoDragDrop(selectedNodes, DragDropEffects.Move);
}
}
}
private void treeView1_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
{
//判断鼠标位置是否在TreeView控件上
Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = treeView1.GetNodeAt(targetPoint);
if (targetNode != null && targetNode.IsVisible)
{
e.Effect = DragDropEffects.Move;
//展开目标节点
targetNode.Expand();
}
else
{
e.Effect = DragDropEffects.None;
}
}
}
private void treeView1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
{
//获取拖拽操作的源节点和目标节点
Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = treeView1.GetNodeAt(targetPoint);
List<TreeNode> draggedNodes = (List<TreeNode>)e.Data.GetData(typeof(List<TreeNode>)));
//循环将所有源节点移动到目标节点下面
foreach (TreeNode node in draggedNodes)
{
if (node.Parent != targetNode)
{
node.Remove();
targetNode.Nodes.Add(node);
}
}
//选中移动后的节点
treeView1.SelectedNodes = draggedNodes;
}
}
```
在上述代码中,我们首先在MouseDown事件中记录用户选择的节点,并记录鼠标按下的位置。然后在MouseMove事件中,如果移动了一定的距离,就开始拖拽操作。在DragOver事件中,判断鼠标位置是否在TreeView控件上,并展开目标节点。在DragDrop事件中,获取拖拽操作的源节点和目标节点,并循环将所有源节点移动到目标节点下面。最后,选中移动后的节点。
阅读全文