Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


show line between siblings when drag/dropping items to indicate target in treeview

Posted on 2010-09-24
Medium Priority
Last Modified: 2013-11-26
During drag and drop of an item in a treeview:
How can our windows forms application show a line between siblings to indicate that the user can drop the item between siblings
Question by:joachim58
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 33757362
Without more details...try something like the below out...

*It only allows "leaf nodes" to be dragged and they can only be dropped on other "leaf nodes".  It also assumes that the leaf nodes are NOT in the root of the TreeView. probably has some quirks left in it but it may give you some ideas:
Public Class Form1

    Private LastNode As TreeNode

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TreeView1.AllowDrop = True
        TreeView1.HideSelection = False
    End Sub

    Private Sub TreeView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim tn As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
            If Not IsNothing(tn) AndAlso tn.Nodes.Count = 0 Then
                LastNode = Nothing
                TreeView1.SelectedNode = tn
                Dim data As New DataObject("MyTreeNode", tn)
                TreeView1.DoDragDrop(data, DragDropEffects.Move)
            End If
        End If
    End Sub

    Private Sub TreeView1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragEnter
        e.Effect = IIf(e.Data.GetDataPresent("MyTreeNode"), DragDropEffects.All, DragDropEffects.None)
    End Sub

    Private Sub TreeView1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragOver
        Dim tn As TreeNode = TreeView1.GetNodeAt(TreeView1.PointToClient(Cursor.Position))
        Dim sourceNode As TreeNode = e.Data.GetData("MyTreeNode")
        If Not IsNothing(tn) AndAlso tn.Nodes.Count = 0 AndAlso Not (tn Is sourceNode) Then
            If Not (tn Is LastNode) Then
                Using G As Graphics = TreeView1.CreateGraphics
                    G.DrawLine(Pens.Red, tn.Bounds.Left, tn.Bounds.Bottom, tn.Bounds.Right, tn.Bounds.Bottom)
                End Using
                LastNode = tn
            End If
            e.Effect = DragDropEffects.All
            e.Effect = DragDropEffects.None
            If Not IsNothing(LastNode) Then
            End If
            LastNode = Nothing
        End If
    End Sub

    Private Sub TreeView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragDrop
        Dim tn As TreeNode = e.Data.GetData("MyTreeNode")
        If Not IsNothing(LastNode) Then
            If Not IsNothing(LastNode.Parent) Then
                LastNode.Parent.Nodes.Insert(LastNode.Parent.Nodes.IndexOf(LastNode) + 1, tn)
            End If
        End If
    End Sub

End Class

Open in new window


Author Comment

ID: 33813546
Thank for the idea and the code that handles a part of our problem.

We need a  solution where the "insert between siblings" is additional functionality on top of the normal drag / drop (where you drop nodes as subnodes). Do you think it will be possible to implement that together, and do you think it will be possible to enhance aour solution so we can drag nodes between nodes that are not leave nodes?
Or does your experience concerning treeview enhancements say: better solution would be for example: show a dialog and ask "drop as sibling or child?"
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 33813954
I only put the leaf node limitation on there to make it easier on me.  I'm pretty sure it could be modified to handle other scenarios...

Just didn't want to have to deal with situations such as if you attempt to drag a grandparent into a grandchild, what is supposed to happen then?

Can you give an example of how "deep" the nodes can go and if there are any constraints on relationships between nodes (other than parent/child).
Amazon Web Services EC2 Cheat Sheet

AWS EC2 is a core part of AWS’s cloud platform, allowing users to spin up virtual machines for a variety of tasks; however, EC2’s offerings can be overwhelming. Learn the basics with our new AWS cheat sheet – this time on EC2!


Author Comment

ID: 33820929
What we'd like to have is advice if trying to add additional functionality to the treeview is easy or should better be avoided.

We implemented a visual feedback about where a node will be placed (child / sibling) by rendering a horizontal line between (="sibling") or a caret beneath (="as child") the nodes. But we noticed, that that changing "between siblings" and "as child" when the user moves the mouse ober nodes is not really a thing that the treeview designers had in mind.

We have 3 types of nodes: From "root" to "leave":
chapter -  structure as deep as necessary, here we have the "as child" or "as sibling" problem
articlegroup - must have a chapter as a parent
order number - must have an articlegroup as a parent

LVL 86

Accepted Solution

Mike Tomlinson earned 1000 total points
ID: 33832083
If it was "easy" then it would be built-in already...   =\

So you have:


Can you explain more about what can be moved to what?...or what cannot be moved to what?

I really don't know if this should be avoided or not...I'd have to really understand what your app does and how the data relates to each other!  Maybe there is a better way to allow the user to re-arrange the data?  Maybe there is a better control or combination of controls that can display the data?  I can't see the "big picture" so I can't really recommend anything...

Author Comment

ID: 33887035
Sorry, i had an influenza and could not work on this task,
meanwhile the problem is solved.
thank you.

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…

715 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question