1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
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();
}
}
}
}
|