Frank Dzaebel, erstellt am: 3.8.2008, zuletzt geändert:
3.8.2008
Kategorie: Drag & Drop, .NET-Version: 2.0, [Download]
Hier wird eine mögliche Implementierung gezeigt, wie Drag
und Drop zwischen zwei TreeViews ermöglicht wird.

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
namespace DragDropTreeView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
treeView1.ItemDrag += new ItemDragEventHandler(TreeView_ItemDrag);
treeView2.ItemDrag += new ItemDragEventHandler(TreeView_ItemDrag);
treeView1.DragOver += new DragEventHandler(TreeView_DragOver);
treeView2.DragOver += new DragEventHandler(TreeView_DragOver);
treeView1.DragEnter += new DragEventHandler(TreeView_DragEnter);
treeView2.DragEnter += new DragEventHandler(TreeView_DragEnter);
treeView1.DragDrop += new DragEventHandler(TreeView_DragDrop);
treeView2.DragDrop += new DragEventHandler(TreeView_DragDrop);
}
void TreeView_DragOver(object sender, DragEventArgs e)
{
TreeView tv = sender as TreeView;
Point point = tv.PointToClient(new Point(e.X, e.Y));
TreeViewHitTestInfo info = tv.HitTest(point);
if (info.Location == TreeViewHitTestLocations.Label)
{
tv.Select();
if (info.Node.Nodes.Count > 0)
info.Node.Expand();
tv.SelectedNode = info.Node;
return;
}
}
/// <summary>"System.Windows.Forms.TreeNode"</summary>
string treeNodeTypeName = typeof(TreeNode).FullName;
void TreeView_DragDrop(object sender, DragEventArgs e)
{
TreeNode newNode;
TreeView destinationTreeView = sender as TreeView;
if (e.Data.GetDataPresent(treeNodeTypeName, false))
{
Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
TreeNode destinationNode = ((TreeView)sender).GetNodeAt(pt);
newNode = (TreeNode)e.Data.GetData(treeNodeTypeName);
if (destinationNode == null)
{
TreeNode nodeToAdd = (TreeNode)newNode.Clone();
destinationTreeView.Nodes.Add(nodeToAdd);
destinationTreeView.Select();
destinationTreeView.SelectedNode = nodeToAdd;
newNode.Remove();
}
else
if (destinationNode.TreeView != newNode.TreeView)
{
TreeNode nodeToAdd = (TreeNode)newNode.Clone();
destinationNode.Nodes.Add(nodeToAdd);
destinationNode.TreeView.Select();
destinationNode.TreeView.SelectedNode = nodeToAdd;
destinationNode.Expand();
newNode.Remove();
}
}
}
void TreeView_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
void TreeView_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
}
}