Perform Drag And Drop Operation On TreeView Node In C# .NET

This blog will show you how you can perform drag and drop operations on treeview control node using C#.Net in Windows application. So for this article first we will create a new windows application and add the below code on form load.
  1. private void Form2_Load(object sender, EventArgs e)  
  2.       {  
  3.           treeView1 = new TreeView();  
  4.   
  5.           this.SuspendLayout();  
  6.   
  7.           // Initialize treeView1.  
  8.           treeView1.AllowDrop = true;  
  9.           treeView1.Dock = DockStyle.Fill;  
  10.   
  11.           // Add nodes to treeView1.  
  12.           TreeNode node;  
  13.           for (int x = 0; x < 5; ++x)  
  14.           {  
  15.               // Add a root node to treeView1.  
  16.               node = treeView1.Nodes.Add(String.Format("Node{0}", x * 4));  
  17.               for (int y = 1; y < 6; ++y)  
  18.               {  
  19.                   // Add a child node to the previously added node.  
  20.                   node = node.Nodes.Add(String.Format("Node{0}", x * 4 + y));  
  21.               }  
  22.           }  
  23.   
  24.           // Add event handlers for the required drag events.  
  25.           treeView1.ItemDrag += new ItemDragEventHandler(treeView1_ItemDrag);  
  26.           treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter);  
  27.           treeView1.DragOver += new DragEventHandler(treeView1_DragOver);  
  28.           treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop);  
  29.   
  30.           // Initialize the form.  
  31.           this.ClientSize = new Size(292, 273);  
  32.           this.Controls.Add(treeView1);  
  33.   
  34.           this.ResumeLayout(false);  
  35.       } 
In the above code I have created nodes of tree view. Now we will perform the operation for the drag and drop feature. First create the tree view control treeView1_ItemDrag event and add the below code. 
  1. private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)  
  2.       {  
  3.           // Move the dragged node when the left mouse button is used.  
  4.           if (e.Button == MouseButtons.Left)  
  5.           {  
  6.               DoDragDrop(e.Item, DragDropEffects.Move);  
  7.           }  
  8.   
  9.           // Copy the dragged node when the right mouse button is used.  
  10.           else if (e.Button == MouseButtons.Right)  
  11.           {  
  12.               DoDragDrop(e.Item, DragDropEffects.Copy);  
  13.           }  
  14.       } 
After this we will create the treeView1_DragEnter event. 
  1. private void treeView1_DragEnter(object sender, DragEventArgs e)  
  2.       {  
  3.           e.Effect = e.AllowedEffect;  
  4.       } 
Now we will create the treeView1_DragOver event, 
  1. private void treeView1_DragOver(object sender, DragEventArgs e)  
  2. {  
  3.     // Retrieve the client coordinates of the mouse position.  
  4.     Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));  
  5.   
  6.     // Select the node at the mouse position.  
  7.     treeView1.SelectedNode = treeView1.GetNodeAt(targetPoint);  

Now we will create the treeView1_DragDrop event, 
  1. private void treeView1_DragDrop(object sender, DragEventArgs e)  
  2.        {  
  3.            // Retrieve the client coordinates of the drop location.  
  4.            Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));  
  5.   
  6.            // Retrieve the node at the drop location.  
  7.            TreeNode targetNode = treeView1.GetNodeAt(targetPoint);  
  8.   
  9.            // Retrieve the node that was dragged.  
  10.            TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));  
  11.   
  12.            // Confirm that the node at the drop location is not   
  13.            // the dragged node or a descendant of the dragged node.  
  14.            if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))  
  15.            {  
  16.                // If it is a move operation, remove the node from its current   
  17.                // location and add it to the node at the drop location.  
  18.                if (e.Effect == DragDropEffects.Move)  
  19.                {  
  20.                    draggedNode.Remove();  
  21.                    targetNode.Nodes.Add(draggedNode);  
  22.                }  
  23.   
  24.                // If it is a copy operation, clone the dragged node   
  25.                // and add it to the node at the drop location.  
  26.                else if (e.Effect == DragDropEffects.Copy)  
  27.                {  
  28.                    targetNode.Nodes.Add((TreeNode)draggedNode.Clone());  
  29.                }  
  30.   
  31.                // Expand the node at the location   
  32.                // to show the dropped node.  
  33.                targetNode.Expand();  
  34.            }  
  35.   
  36.        } 
After that we will use the below function to perform parent child relation, 
  1. private bool ContainsNode(TreeNode node1, TreeNode node2)  
  2.      {  
  3.          // Check the parent node of the second node.  
  4.          if (node2.Parent == nullreturn false;  
  5.          if (node2.Parent.Equals(node1)) return true;  
  6.   
  7.          // If the parent node is not null or equal to the first node,   
  8.          // call the ContainsNode method recursively using the parent of   
  9.          // the second node.  
  10.          return ContainsNode(node1, node2.Parent);  
  11.      } 
Now we are done. Run the code to check the output.