// The ItemDrag event is called when the item drag begins. Here is
// where you can perform any tracking, or validate if the drag
// operation should occur, and so on.
private void myTree_ItemDrag
(object sender, ItemDragEventArgs e
)
{
sourceNode =
(TreeNode
) e.
Item;
DoDragDrop
(e.
Item.
ToString(), DragDropEffects.
Move | DragDropEffects.
Copy);
}
// Define the event that occurs while the dragging happens
private void myTree_DragEnter
(object sender, DragEventArgs e
)
{
if (e.
Data.
GetDataPresent(DataFormats.
Text))
{
e.
Effect = DragDropEffects.
Move;
else
e.
Effect = DragDropEffects.
None;
}
}
// Determine what node in the tree we are dropping on to (target),
// copy the drag source (sourceNode), make the new node and delete
// the old one.
private void myTree_DragDrop
(object sender, DragEventArgs e
)
{
Point pos = myTree.
PointToClient(new Point
(e.
X, e.
Y));
TreeNode targetNode = myTree.
GetNodeAt(pos
);
TreeNode nodeCopy;
if (targetNode !=
null)
{
nodeCopy =
new TreeNode
(sourceNode.
Text, sourceNode.
ImageIndex, sourceNode.
SelectedImageIndex);
if (sourceNode.
Index > targetNode.
Index)
targetNode.
Parent.
Nodes.
Insert(targetNode.
Index, nodeCopy
);
else
targetNode.
Parent.
Nodes.
Insert(targetNode.
Index +
1, nodeCopy
);
sourceNode.
Remove();
myTree.
Invalidate();
}
}