Drag & Drop TreeView  
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);
    }
  }
}