Murray Brown
asked on
VB.net Drop text after TreeView node dragged
Hi. I am using the code below to drag a TreeView node onto both the same TreeView to link to another node (where a line is drawn between the two) as well as a DataGridView. I also want to be able to drop the text into an Excel spreadsheet without disrupting any of the others
Private Sub TreeView_From_ItemDrag(sen der As Object, e As System.Windows.Forms.ItemD ragEventAr gs) Handles TreeView_From.ItemDrag
'Set the drag node and initiate the DragDrop
DoDragDrop(e.Item, DragDropEffects.Move Or DragDropEffects.Copy)
End Sub
Private Sub TreeView_From_DragEnter(se nder As Object, e As System.Windows.Forms.DragE ventArgs) Handles TreeView_From.DragEnter
'See if there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys tem.Window s.Forms.Tr eeNode", _
True) Then
'TreeNode found allow move effect
'e.Effect = DragDropEffects.Move
e.Effect = DragDropEffects.All
Else
'No TreeNode found, prevent move
e.Effect = DragDropEffects.None
Exit Sub
End If
'intFrom_X_Axis = e.X - 50
intFrom_X_Axis = 1535
'Check number of nodes and base position on this
Dim intNumberJoins As Integer = CInt(Me.lblNumberJoins.Tex t)
If intNumberJoins = 0 Then
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 1 Then
intFrom_X_Axis = intFrom_X_Axis + 2
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 2 Then
intFrom_X_Axis = intFrom_X_Axis + 4
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 3 Then
intFrom_X_Axis = intFrom_X_Axis + 6
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 4 Then
intFrom_X_Axis = intFrom_X_Axis + 8
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 5 Then
intFrom_X_Axis = intFrom_X_Axis + 10
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 6 Then
intFrom_X_Axis = intFrom_X_Axis + 12
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 7 Then
intFrom_X_Axis = intFrom_X_Axis + 14
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 8 Then
intFrom_X_Axis = intFrom_X_Axis + 16
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
End If
oFrom_Point = Me.TreeView_From.PointToCl ient(New Point(intFrom_X_Axis, e.Y))
End Sub
Private Sub TreeView_From_DragOver(sen der As Object, e As System.Windows.Forms.DragE ventArgs) Handles TreeView_From.DragOver
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys tem.Window s.Forms.Tr eeNode", _
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'As the mouse moves over nodes, provide feedback to
'the user by highlighting the node that is the
'current drop target
Dim pt As Point = _
CType(sender, TreeView).PointToClient(Ne w Point(e.X, e.Y))
Dim targetNode As TreeNode = selectedTreeview.GetNodeAt (pt)
'See if the targetNode is currently selected,
'if so no need to validate again
If Not (selectedTreeview.Selected Node Is targetNode) Then
'Select the node currently under the cursor
selectedTreeview.SelectedN ode = targetNode
'Check that the selected node is not the dropNode and
'also that it is not a child of the dropNode and
'therefore an invalid target
Dim dropNode As TreeNode = _
CType(e.Data.GetData("Syst em.Windows .Forms.Tre eNode"), _
TreeNode)
Do Until targetNode Is Nothing
If targetNode Is dropNode Then
e.Effect = DragDropEffects.None
Exit Sub
End If
targetNode = targetNode.Parent
Loop
End If
'Currently selected node is a suitable target
e.Effect = DragDropEffects.Move
End Sub
Private Sub TreeView_From_DragDrop(sen der As Object, e As System.Windows.Forms.DragE ventArgs) Handles TreeView_From.DragDrop
Dim oTableColumn1 As String
Dim oTableColumn2 As String
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys tem.Window s.Forms.Tr eeNode", _
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'Get the TreeNode being dragged
Dim dropNode As TreeNode = _
CType(e.Data.GetData("Syst em.Windows .Forms.Tre eNode"), _
TreeNode)
'The target node should be selected from the DragOver event
Dim targetNode As TreeNode = selectedTreeview.SelectedN ode
'Remove the drop node from its current location
'dropNode.Remove() '######
'If there is no targetNode add dropNode to the bottom of
'the TreeView root nodes, otherwise add it to the end of
'the dropNode child nodes
If targetNode Is Nothing Then
'selectedTreeview.Nodes.Ad d(dropNode ) '#######
Exit Sub
Else
'targetNode.Nodes.Add(drop Node) '######
targetNode.ForeColor = Color.DarkOrange
dropNode.ForeColor = Color.DarkOrange
'targetNode.Name
'Point p = this.PointToScreen(picture Box1.Locat ion);
'oTo_Point = Me.TreeView_From.PointToCl ient(New Point(e.X, e.Y))
oTo_Point = Me.TreeView_From.PointToCl ient(New Point(intFrom_X_Axis, e.Y))
'Add the join
oTableColumn1 = "[" & targetNode.Parent.Text & "]" & "[" & targetNode.Text & "]"
oTableColumn2 = "[" & dropNode.Parent.Text & "]" & "[" & dropNode.Text & "]"
DGV_Joins.Rows.Add("Joined ", oTableColumn1, oTableColumn2, "Joined")
End If
'Ensure the newley created node is visible to
'the user and select it
dropNode.EnsureVisible()
selectedTreeview.SelectedN ode = dropNode
oDrawLine()
'DrawDottedLine()
' oEraseLine()
End Sub
Private Sub TreeView_From_ItemDrag(sen
'Set the drag node and initiate the DragDrop
DoDragDrop(e.Item, DragDropEffects.Move Or DragDropEffects.Copy)
End Sub
Private Sub TreeView_From_DragEnter(se
'See if there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys
True) Then
'TreeNode found allow move effect
'e.Effect = DragDropEffects.Move
e.Effect = DragDropEffects.All
Else
'No TreeNode found, prevent move
e.Effect = DragDropEffects.None
Exit Sub
End If
'intFrom_X_Axis = e.X - 50
intFrom_X_Axis = 1535
'Check number of nodes and base position on this
Dim intNumberJoins As Integer = CInt(Me.lblNumberJoins.Tex
If intNumberJoins = 0 Then
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 1 Then
intFrom_X_Axis = intFrom_X_Axis + 2
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 2 Then
intFrom_X_Axis = intFrom_X_Axis + 4
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 3 Then
intFrom_X_Axis = intFrom_X_Axis + 6
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 4 Then
intFrom_X_Axis = intFrom_X_Axis + 8
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 5 Then
intFrom_X_Axis = intFrom_X_Axis + 10
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 6 Then
intFrom_X_Axis = intFrom_X_Axis + 12
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 7 Then
intFrom_X_Axis = intFrom_X_Axis + 14
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
ElseIf intNumberJoins = 8 Then
intFrom_X_Axis = intFrom_X_Axis + 16
Me.lblNumberJoins.Text = CStr(intNumberJoins + 1)
End If
oFrom_Point = Me.TreeView_From.PointToCl
End Sub
Private Sub TreeView_From_DragOver(sen
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'As the mouse moves over nodes, provide feedback to
'the user by highlighting the node that is the
'current drop target
Dim pt As Point = _
CType(sender, TreeView).PointToClient(Ne
Dim targetNode As TreeNode = selectedTreeview.GetNodeAt
'See if the targetNode is currently selected,
'if so no need to validate again
If Not (selectedTreeview.Selected
'Select the node currently under the cursor
selectedTreeview.SelectedN
'Check that the selected node is not the dropNode and
'also that it is not a child of the dropNode and
'therefore an invalid target
Dim dropNode As TreeNode = _
CType(e.Data.GetData("Syst
TreeNode)
Do Until targetNode Is Nothing
If targetNode Is dropNode Then
e.Effect = DragDropEffects.None
Exit Sub
End If
targetNode = targetNode.Parent
Loop
End If
'Currently selected node is a suitable target
e.Effect = DragDropEffects.Move
End Sub
Private Sub TreeView_From_DragDrop(sen
Dim oTableColumn1 As String
Dim oTableColumn2 As String
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'Get the TreeNode being dragged
Dim dropNode As TreeNode = _
CType(e.Data.GetData("Syst
TreeNode)
'The target node should be selected from the DragOver event
Dim targetNode As TreeNode = selectedTreeview.SelectedN
'Remove the drop node from its current location
'dropNode.Remove() '######
'If there is no targetNode add dropNode to the bottom of
'the TreeView root nodes, otherwise add it to the end of
'the dropNode child nodes
If targetNode Is Nothing Then
'selectedTreeview.Nodes.Ad
Exit Sub
Else
'targetNode.Nodes.Add(drop
targetNode.ForeColor = Color.DarkOrange
dropNode.ForeColor = Color.DarkOrange
'targetNode.Name
'Point p = this.PointToScreen(picture
'oTo_Point = Me.TreeView_From.PointToCl
oTo_Point = Me.TreeView_From.PointToCl
'Add the join
oTableColumn1 = "[" & targetNode.Parent.Text & "]" & "[" & targetNode.Text & "]"
oTableColumn2 = "[" & dropNode.Parent.Text & "]" & "[" & dropNode.Text & "]"
DGV_Joins.Rows.Add("Joined
End If
'Ensure the newley created node is visible to
'the user and select it
dropNode.EnsureVisible()
selectedTreeview.SelectedN
oDrawLine()
'DrawDottedLine()
' oEraseLine()
End Sub
ASKER
but
Private Sub TreeView_From_DragOver(sen der As Object, e As System.Windows.Forms.DragE ventArgs) Handles TreeView_From.DragOver
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys tem.Window s.Forms.Tr eeNode", _
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'As the mouse moves over nodes, provide feedback to
'the user by highlighting the node that is the
'current drop target
Dim pt As Point = _
CType(sender, TreeView).PointToClient(Ne w Point(e.X, e.Y))
Dim targetNode As TreeNode = selectedTreeview.GetNodeAt (pt) I get the position of the node in the following code
Private Sub TreeView_From_DragOver(sen
'Check that there is a TreeNode being dragged
If e.Data.GetDataPresent("Sys
True) = False Then Exit Sub
'Get the TreeView raising the event (incase multiple on form)
Dim selectedTreeview As TreeView = CType(sender, TreeView)
'As the mouse moves over nodes, provide feedback to
'the user by highlighting the node that is the
'current drop target
Dim pt As Point = _
CType(sender, TreeView).PointToClient(Ne
Dim targetNode As TreeNode = selectedTreeview.GetNodeAt
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks. Working well so far but I am still finding problems getting the X and Y points of the nodes to draw my line. Might post a further question. Thanks very much so far. Its drpping into my Excel cell perfectly
Instead of using e.Item, use e.Item.Text or e.Item.Name and Excel would be able to handle the drop for you.
You would need to change the DragDrop event code in the other treeview so that you use the text to create a node rather than adding the dropped node.