TreeView Drag n Drop





9
Date Submitted Fri. Aug. 25th, 2006 7:46 PM
Revision 1 of 1
Helper psykoprogrammer
Tags .Net | C | drag | drop | treeview
Comments 2 comments
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.


// 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();
  }
}

 

Adam Presley

www.adampresley.com

Comments

Comments C#, maybe . . .
Mon. Sep. 4th, 2006 12:24 PM    Scripter sehrgut
Comments Apologies
Tue. Sep. 5th, 2006 5:53 AM    Helper psykoprogrammer

Voting