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