Das folgende Beispiel zeigt wie Knoten im TreeView per Drag&Drop ähnlich wie im Windows-Explorer verschoben/kopiert werden können. Beim Ziehen wird zwischen linken und rechter Maus unterschieden.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace TreeView_DragDrop
{
public partial class Form1 : Form
{
private bool _dragdropCopy = false;
private DragEventArgs _dragEventArgs;
private MouseButtons _mouseButton;
//---------------------------------------------------------------------
#region Form-Events
public Form1()
{
InitializeComponent();
}
//---------------------------------------------------------------------
private void Form1_Load(object sender, EventArgs e)
{
treeView1.ExpandAll();
}
#endregion
//---------------------------------------------------------------------
/// <summary>
/// Beginnt den DragDrop-Vorgang
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
// Zu verschiebenden Knoten wählen:
TreeNode sourceNode = (TreeNode)e.Item;
_mouseButton = e.Button;
// DragDrop beginnen:
DoDragDrop(
sourceNode,
DragDropEffects.Move | DragDropEffects.Copy);
}
//---------------------------------------------------------------------
/// <summary>
/// Validiert ob der DragDrop-Vorgang zugelassen wird
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DragEnter(object sender, DragEventArgs e)
{
// Nur TreeNodes werden zugelassen:
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
// Strg-Taste gedrück? Prüfung über Bitmaske:
if ((e.KeyState & 8) == 8)
e.Effect = DragDropEffects.Copy;
// nur linke Maustaste
else
e.Effect = DragDropEffects.Move;
}
else
e.Effect = DragDropEffects.None;
}
//---------------------------------------------------------------------
/// <summary>
/// Verschiebt den Knoten
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DragDrop(object sender, DragEventArgs e)
{
_dragEventArgs = e;
// Behandlung von Verschieben oder Kopieren:
if (_mouseButton == MouseButtons.Right)
{
ctxDragDropKopieren.Visible =
((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy);
ctxDragDropVerschieben.Visible =
((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move);
ctxDragDrop.Show(e.X, e.Y);
}
else
{
_dragdropCopy = (e.Effect == DragDropEffects.Copy);
TreeViewDragDropVerarbeiten();
}
}
//---------------------------------------------------------------------
private void ctxDragDropKopieren_Click(object sender, EventArgs e)
{
_dragdropCopy = true;
TreeViewDragDropVerarbeiten();
}
//---------------------------------------------------------------------
private void ctxDragDropVerschieben_Click(object sender, EventArgs e)
{
_dragdropCopy = false;
TreeViewDragDropVerarbeiten();
}
//---------------------------------------------------------------------
private void TreeViewDragDropVerarbeiten()
{
TreeNode sourceNode =
_dragEventArgs.Data.GetData(typeof(TreeNode)) as TreeNode;
// Knoten ermitteln dem der gedragte Knoten hinzugefügt werden
// soll:
Point p = treeView1.PointToClient(new Point(
_dragEventArgs.X,
_dragEventArgs.Y));
TreeNode targetNode = treeView1.GetNodeAt(p);
if (targetNode != null)
{
TreeNode newNode = (TreeNode)sourceNode.Clone();
// Hinzufügen des neuen Knotens:
targetNode.Nodes.Add(newNode);
// Verschieben oder Kopieren?
if (!_dragdropCopy) // Verschieben
sourceNode.Remove();
// Neuzeichnen des TreeView:
treeView1.Invalidate();
treeView1.ExpandAll();
}
}
}
}
4 Kommentare zum Snippet