TreeView Drag n Drop
9
Below is a bit of code which sets up drag and drop in a treeview. This is handy for if you have a list of items that can be sorted by the user.
Here is a bit of code to demonstrate how to do this. First create a new Windows executable project. Drop a TreeView component on the form, and let's name it 'myTree' for this demonstration. Go ahead and populate it with some dummy data; enough data to see the dragging and dropping in action. You will need a variable global to the form's scope.
private TreeNode sourceNode;
This is used to track the item we are dragging in our TreeView. Then define the event handlers listed below.
Here is a bit of code to demonstrate how to do this. First create a new Windows executable project. Drop a TreeView component on the form, and let's name it 'myTree' for this demonstration. Go ahead and populate it with some dummy data; enough data to see the dragging and dropping in action. You will need a variable global to the form's scope.
private TreeNode sourceNode;
This is used to track the item we are dragging in our TreeView. Then define the event handlers listed below.
// 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();
}
}






I've got good news, and I've got bad news:
The universe is merely a figment of my imagination.
Now are you ready for the bad news?