Drag und Drop innerhalb eines TreeViews

  • im Beispiel wird eine TreeNode innerhalb des TreeViews verschoben
  • als erstes ist das Ereignis ItemDrag zu behandeln:
private void TreeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
    TreeView tv = sender as TreeView;

    if (tv != null)
    {
        if (tv.SelectedNode != null)
        {
            tv.DoDragDrop(tv.SelectedNode, DragDropEffects.Copy);
        }
    }
}
  • beim TreeView muss die Eigenschaft AllowDrop = True gesetzt sein
  • zusätzlich sind die Ereignisse DragOver und DragDrop zu behandeln:
private void TreeView1_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.None;

    // Quellnode
    TreeNode tns = e.Data.GetData(typeof(TreeNode)) as TreeNode;
    // akt. Zielnode unter dem Mauspfeil
    TreeNode tnd = TreeView1.GetNodeAt(TreeView1.PointToClient(new Point(e.X, e.Y)));

    if ((tns != null) && (tnd != null))
    {
        // hier im Beispiel die Verschiebung nur zulassen, wenn ChildNodes (Level == 1)
        // auf andere Parent-/Rootnodes (Level == 0) gezogen werden.
        if ((TreeView1.SelectedNode.Level == 1) && (tnd.Level == 0) && (tnd != tns.Parent))
        {
            e.Effect = DragDropEffects.Copy;
        }
    }
}

private void TreeView1_DragDrop(object sender, DragEventArgs e)
{
    // Quellnode
    TreeNode tns = e.Data.GetData(typeof(TreeNode)) as TreeNode;
    // akt. Zielnode unter dem Mauspfeil
    TreeNode tnd = TreeView1.GetNodeAt(TreeView1.PointToClient(new Point(e.X, e.Y)));

    if ((tns != null) && (tnd != null))
    {
        // neue TreeNode aus Clone der Quellnode erstellen
        TreeNode tnnew = (TreeNode)tns.Clone();
        tnd.Nodes.Add(tnnew);
        tnd.Expand();

        // alte Quell-TreeNode entfernen
        TreeNode cat = tns.Parent;
        cat.Nodes.Remove(tns);
    }
}