Feedback

C# - TreeView Drag&Drop

Veröffentlicht von am 5/9/2009
(3 Bewertungen)
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();
			}
		}
	}
}
Abgelegt unter Treeview, Drag, Drop, kopieren, verschieben.

4 Kommentare zum Snippet

Andrew schrieb am 5/15/2012:
Hallo Günther,
obiger Code täte wirklich genau das, was ich ich dringend suche.
Aber: diese 3 Dinge(?) können im Kontext nicht gefunden werden. Was muss ich tun, damit der Code läuft?
ctxDragDropKopieren.Visible
ctxDragDropVerschieben.Visible
ctxDragDrop.Show(e.X, e.Y);

Vielen Dank für eine schnelle Aufklärung.

Grüsse

Andrew
Andrew schrieb am 5/18/2012:
ctxDragDropKopieren.Visible
ctxDragDropVerschieben.Visible
ctxDragDrop.Show(e.X, e.Y);
Sind das die Icons, die im Tree angezeigt werden?
Andrew schrieb am 5/24/2012:
Hallo niemand zu Hause? Schade, dass niemand antwortet.
bsmicron schrieb am 6/4/2012:
Hallo Andrew,
erstelle ein Kontextmenu und gebe diesen den Namen ctxDragDrop. Hier fügst Du 2 Menüpunkte hinzu: Verschieben und Kopieren. Dem Menüpunkt Kopieren gibst Du den Namen 'ctxDragDropKopieren'. Dem Menüpunkt Verschieben gibst du den Namen 'ctxDragDropVerschieben'. Nun verbindest Du noch die beiden click Ereignisse mit den passenden Prozeduren. Also Kopieren mit ctxDragDropKopieren_Click und Verschieben mit ctxDragDropVerschieben_Click. Damit das ganze auch funktioniert musst Du noch in dem TreeView Element das Feld AllowDrag auf true stellen.
Ich hoffe das hilft Dir weiter.
Gruß bsmicron
 

Logge dich ein, um hier zu kommentieren!