Drag/Drop and Copy Control in a TreeView Using Visual Basic 2008

In this tutorial, I will show you how to drag/drop and copy in a Treeview by using Visual Basic 2008. I made this to show you not only a PictureBox or a TextBox can be drag and drop but also a treeview. Let’s begin: Open Visual Basic 2008, create a new Windows Application and drag the two Treeview in the Form. Name it “trview_left” and “trview_right”. first form After that, click the two Treeviews and go to the properties. In the properties, click the events that look like a lightning symbol and double click the Drag/Drop event handler. And do this following code. Declare this constant variable above the sub procedure.
  1.  
  2. 'DECLARE A CONSTANT VARIABLE
  3. 'IT IS USED FOR DETECTING THE CTRL KEY WHETHER THE CTRL KEY WAS PRESSED OR NOT DURING THE DRAG OPERATION
  4. Const mask_ctrl As Int32 = 8
  1. Private Sub TreeView_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles trview_left.DragDrop, trview_right.DragDrop
  2.  
  3.         'SET A VARIABLE TO HOLDS THE NODE TO BE DRAGGED
  4.         Dim nodeorigination As TreeNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), TreeNode)
  5.  
  6.         'GETDATAPRESENT IS A BIT DIFFERENT FROM A TREEVIEW AND PICTUREBOX CONTROL.
  7.         'THE TREENODE IS NOT INCLUDED IN THE DATAFORMATS CLASS. THAT'S WHY IT'S NOT A PREDEFINED TYPE
  8.         'ONE OF THE GETDATAPRESENT CONTAINS A STRING THAT SPECIFY THE TYPE.
  9.         If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", False) Then
  10.             Dim pnt As Point
  11.             Dim distination_node As TreeNode
  12.  
  13.             'POINTTOCLIENT IS USED TO COMPUTE THE LOCATION OF THE MOUSE OVER THE DESTINATION TREEVIEW
  14.             pnt = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y))
  15.             'POINT IS USED TO GET THE CLOSEST NODE IN THE DESTINATION TREEVIEW
  16.             distination_node = CType(sender, TreeView).GetNodeAt(pnt)
  17.  
  18.             'IF THE NEW NODE WAS NOT DROPPED DIRECTLY AT THE TOP OF THE NODE,
  19.             'THEN THE RESULT OF THE DESTINATIONNODE WILL BE NOTHING
  20.             If distination_node IsNot Nothing Then
  21.                 'IF THE ORIGINAL NODE AND DISTINATION NODE ARE THE SAME, THE THE NODE WOULD DISAPPEAR.
  22.                 'THIS CODE INSURES THAT IT WILL NOT HAPPEN.                
  23.                 If Not distination_node.TreeView Is nodeorigination.TreeView Then
  24.                     distination_node.Nodes.Add(CType(nodeorigination.Clone, TreeNode))
  25.                     'EMPHASIZE PARENT NOT WHEN ADDING THE NEW NODE, WITHOUT THIS , ONLY THE a+ SYMBOL WILL APPEAR.
  26.                     distination_node.Expand()
  27.  
  28.                     If (e.KeyState And maskctrl) <> maskctrl Then 'CHECKING THE CTRL KEY WAS NOT PRESSED
  29.                         nodeorigination.Remove() 'REMOVE THE NODE
  30.                     End If
  31.                 End If
  32.             End If
  33.         End If
  34.     End Sub
Then, click the method name and choose the Drag/Enter events handler, and do this following code.
  1. Private Sub TreeView_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles trview_left.DragEnter, trview_right.DragEnter
  2.  
  3.         If (e.Data.GetDataPresent("System.Windows.Forms.TreeNode")) Then 'CHECKING THE DRAG CONTENT TO BE SURE THAT IT IS THE CORRECT TYPE.
  4.  
  5.             If (e.KeyState And maskctrl) = maskctrl Then 'CHECKINKG IF THE CTRL KEY WAS PRESSED.
  6.                 'IF IT WAS PRESSED
  7.                 e.Effect = DragDropEffects.Copy 'PERFORM COPY
  8.             Else
  9.                 'IF IT WAS NOT PRESSED
  10.                 e.Effect = DragDropEffects.Move 'PERFORM A MOVE
  11.             End If
  12.         Else
  13.             'REJECT THE DROP
  14.             e.Effect = DragDropEffects.None
  15.         End If
  16.     End Sub
Go back to the method name again and choose the Item/Drag event handler and do this following code.
  1. Private Sub TreeView_ItemDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles trview_left.ItemDrag, trview_right.ItemDrag
  2.         If e.Button = Windows.Forms.MouseButtons.Left Then
  3.             'PERFORM THE DRAG AND DROP OPERATION.
  4.             DoDragDrop(e.Item, DragDropEffects.Move Or DragDropEffects.Copy)
  5.         End If
  6.     End Sub
You can download the complete source code.

Add new comment