Need winform example: Drag from Grid to Treeview

18 posts, 1 answers
  1. Richard Thurgood
    Richard Thurgood avatar
    26 posts
    Member since:
    Nov 2007

    Posted 18 Jul 2008 Link to this post

    I'd sure appreciate some help. I see some examples for web applications but I need a simple way to drag/drop a selected row from a grid into a treeview on a winform.

    I don't see any properties on the grid that allow drag and I have the lastest evaluation version installed.

    Anyone? 
  2. Jordan
    Admin
    Jordan avatar
    547 posts

    Posted 22 Jul 2008 Link to this post

    Hi Richard Thurgood,

    We are working on a drag and drop framework for RadControls for WinForms which will allow easy implementation of drag and drop functionality. Unfortunately I cannot give you a specific time frame at the moment, but I think we could estimate that we'll have it for Q3 2008.

    In the meantime you can use the drag and drop functionality that is available in Windows Forms to implement dragging from a RadGridView to a RadTreeView control like that:
    protected override void OnLoad(EventArgs e) 
            { 
                base.OnLoad(e); 
     
                this.radGridView1.Rows.Add("Name1""Value1"); 
                this.radGridView1.Rows.Add("Name2""Value2"); 
                this.radGridView1.Rows.Add("Name3""Value3"); 
     
                this.radTreeView1.AllowDrop = true
                this.radGridView1.MouseDown += new MouseEventHandler(radGridView1_MouseDown); 
                this.radTreeView1.DragEnter += new DragEventHandler(radTreeView1_DragEnter); 
                this.radTreeView1.DragDrop += new DragEventHandler(radTreeView1_DragDrop); 
            } 
     
            void radGridView1_MouseDown(object sender, MouseEventArgs e) 
            { 
                GridViewRowInfo currentRow = this.radGridView1.MasterGridViewInfo.CurrentRow; 
                radGridView1.DoDragDrop(currentRow.Cells[0].Value, DragDropEffects.Copy); 
            } 
     
            void radTreeView1_DragDrop(object sender, DragEventArgs e) 
            { 
                string text = e.Data.GetData(DataFormats.Text).ToString(); 
                RadTreeNode newNode = new RadTreeNode(text); 
     
                Point p = this.radTreeView1.PointToClient(new Point(e.X, e.Y)); 
                RadTreeNode targetNode = this.radTreeView1.GetNodeAt(p.X, p.Y); 
     
                RadTreeNodeCollection targetCollection = (targetNode != null) ? targetNode.Nodes : this.radTreeView1.Nodes; 
                targetCollection.Add(newNode); 
            } 
     
            void radTreeView1_DragEnter(object sender, DragEventArgs e) 
            { 
                e.Effect = (e.Data.GetDataPresent(DataFormats.Text)) ? DragDropEffects.Copy : DragDropEffects.None; 
            } 

    Hope this helps.

    All the best,
    Jordan
    the Telerik team

    Instantly find answers to your questions at the new Telerik Support Center
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Richard Thurgood
    Richard Thurgood avatar
    26 posts
    Member since:
    Nov 2007

    Posted 22 Jul 2008 Link to this post

    That's fantastic!  THANKS!

    (NOTE: I had to add columns to the code prior to adding the data, but the sample code was just what I needed)
  5. Richard Thurgood
    Richard Thurgood avatar
    26 posts
    Member since:
    Nov 2007

    Posted 30 Jul 2008 Link to this post

    Uh oh - I thought this was going to work but now I see that I have issues with selecting rows, sorting and scrolling since the event is hooked to "MouseDown".  Any other suggestions? 
  6. Jordan
    Admin
    Jordan avatar
    547 posts

    Posted 31 Jul 2008 Link to this post

    Hi Richard,

    I tested the project again and indeed found a bug that present when you try to scroll or sort.
    The solution is to merely check if the current row is not null :
    void radGridView1_MouseDown(object sender, MouseEventArgs e) 
            { 
                GridViewRowInfo currentRow = this.radGridView1.MasterGridViewInfo.CurrentRow; 
                if (currentRow != null
                { 
                    radGridView1.DoDragDrop(currentRow.Cells[0].Value, DragDropEffects.Copy); 
                } 
            } 

    If that is not what you need, please write back with some more details about the problems that you are experiencing.

    Kind regards,
    Jordan
    the Telerik team

    Check out Telerik Trainer, the state of the art learning tool for Telerik products.
  7. Richard Thurgood
    Richard Thurgood avatar
    26 posts
    Member since:
    Nov 2007

    Posted 31 Jul 2008 Link to this post

    Actually, I already did that. I found that issue shortly after I tried the sample code so I rectified it prior to my post.  That said, you still can't sort, select or scroll properly once you've tied into the mouse down event. 

    For example, select a row and then try to sort or scroll. You'll see it doesn't function properly.

    Suggestions?
  8. Answer
    Jordan
    Admin
    Jordan avatar
    547 posts

    Posted 01 Aug 2008 Link to this post

    Hello Richard Thurgood,

    It turned out that in order to have the problems solved, you must call  DoDragDrop in the mouse move handler. Here is the solution that I suggest:
    private Point startPoint = Point.Empty; 
            private GridViewRowInfo currentRow = null
     
            void radGridView1_MouseDown(object sender, MouseEventArgs e) 
            { 
                if (this.radGridView1.GridElement.VScrollBar.ControlBoundingRectangle.Contains(e.Location)) 
                { 
                    return
                } 
                if (e.Button != MouseButtons.Left) 
                { 
                    return
                } 
                this.currentRow = this.radGridView1.MasterGridViewInfo.CurrentRow; 
                if (this.currentRow == null
                { 
                    return
                } 
     
                this.startPoint = e.Location; 
            } 
     
            void radGridView1_MouseMove(object sender, MouseEventArgs e) 
            { 
                if (e.Button != MouseButtons.Left) 
                { 
                    return
                } 
     
                if (this.radGridView1.GridElement.VScrollBar.ControlBoundingRectangle.Contains(e.Location)) 
                { 
                    return
                } 
     
                if (Math.Abs(e.X - this.startPoint.X) < SystemInformation.DragSize.Width 
                  && Math.Abs(e.Y - this.startPoint.Y) < SystemInformation.DragSize.Height) 
                { 
                    return
                } 
     
                if (this.currentRow == null
                { 
                    return
                } 
     
                radGridView1.DoDragDrop(this.currentRow.Cells[0].Value, DragDropEffects.Copy); 
            } 

    Please give it a try and write me back if you need more assistance.

    Sincerely yours,
    Jordan
    the Telerik team

    Check out Telerik Trainer, the state of the art learning tool for Telerik products.
  9. Richard Thurgood
    Richard Thurgood avatar
    26 posts
    Member since:
    Nov 2007

    Posted 08 Aug 2008 Link to this post

    Thanks for your reply. Yes, this worked. I added:

    if (this.radGridView1.GridElement.HScrollBar.ControlBoundingRectangle.Contains(e.Location))
    {
     return;
    }


    ...to handle the horizontal scrolling like you did with the vertial scrolling. Well, it works for now and I'll update the code when you have the DragDrop released in Q3.

    Thanks again!

  10. Jordan
    Admin
    Jordan avatar
    547 posts

    Posted 08 Aug 2008 Link to this post

    Hi Richard,

    Glad to see that I could help.
    Just to clarify, we are still evaluating the Drag and Drop framework and I cannot promise you that it will be available in the Q3 2008 release.

    Kind regards,
    Jordan
    the Telerik team

    Check out Telerik Trainer, the state of the art learning tool for Telerik products.
  11. Ilya
    Ilya avatar
    4 posts
    Member since:
    Feb 2008

    Posted 02 Oct 2008 Link to this post

    Hi there...

    I've got all this working from a GridView to nodes in a tree.
    On mouse over each of the nodes while dragging from the grid, i really need for each node to highlight. At the moment there is not good visual feedback to show that the item from the grid will be dropping into a specific node.

    Can you shed some light on this?

    Thanks,
    ilya.
  12. Jordan
    Admin
    Jordan avatar
    547 posts

    Posted 03 Oct 2008 Link to this post

    Hi Ilya,

    The drop indication that you may have seen in the examples is a part of the RadTreeView drag and drop functionality. Unfortunately, it is not available for usage outside the treeview.
     
    A solution I can suggest is to try changing the the cursor when the mouse is over a node in order to give visual feedback.

     
    Sincerely yours,
    Jordan
    the Telerik team

    Check out Telerik Trainer, the state of the art learning tool for Telerik products.
  13. Jure
    Jure avatar
    13 posts
    Member since:
    Aug 2008

    Posted 03 Feb 2009 Link to this post

    Hi.

    Excellent code, thanks.

    Here's the code to highlight a node that is being dragged over (VB.net - use converter for C#):
    'class level 
    Private currentNode As RadTreeNode 
     
    Private Sub tree_DragOver(ByVal sender As ObjectByVal e As System.Windows.Forms.DragEventArgs) Handles tree.DragOver 
            Dim p As Point = Me.tree.PointToClient(New Point(e.X, e.Y)) 
     
            If Not currentNode Is Nothing Then 
                currentNode.BackColor = Color.Transparent 
            End If 
     
            currentNode = Me.tree.GetNodeAt(p.X, p.Y) 
            currentNode.BackColor = Color.OrangeRed 
     
        End Sub 

    Edit: Here's the relevant (though not too clean) code for efficient (only data rows and not header or scrollbar) dragging:

     Private Sub gridView1_MouseDown(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles gridView1.MouseDown 
            If Me.gridView1.GridElement.VScrollBar.ControlBoundingRectangle.Contains(e.Location) Then 
                Return 
            End If 
     
            If (Not e.Button = Windows.Forms.MouseButtons.Left) Then 
                Return 
            End If 
     
            'must be GridDataCellElement and NOT GridHeaderCellElement to drag & drop 
            If TypeOf Me.gridView1.ElementTree.GetElementAtPoint(e.Location) Is GridDataCellElement And _ 
               (Not TypeOf Me.gridView1.ElementTree.GetElementAtPoint(e.Location) Is GridHeaderCellElement) Then 
                Me.currentRow = Me.gridView1.MasterGridViewInfo.CurrentRow 
            Else 
                Me.currentRow = Nothing 
            End If 
     
            If Me.currentRow Is Nothing Then 
                Return 
            End If 
            Me.startPoint = e.Location 
     
        End Sub 
     
        Private Sub gridView1_MouseMove(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles gridView1.MouseMove 
            If Not e.Button = Windows.Forms.MouseButtons.Left Then 
                Return 
            End If 
            If Me.gridView1.GridElement.VScrollBar.ControlBoundingRectangle.Contains(e.Location) Then 
                Return 
            End If 
            If (Math.Abs(e.X - Me.startPoint.X) < SystemInformation.DragSize.Width) And (Math.Abs(e.Y - Me.startPoint.Y) < SystemInformation.DragSize.Height) Then 
                Return 
            End If 
            If Me.currentRow Is Nothing Then 
                Return 
            End If 
     
            'must be GridDataCellElement to drag & drop 
            If TypeOf Me.gridView1.ElementTree.GetElementAtPoint(e.Location) Is GridDataCellElement Then 
                Me.gridView1.DoDragDrop(Me.currentRow.Cells(0).Value, DragDropEffects.Copy) 
            End If 
     
        End Sub 



  14. Jay
    Jay avatar
    25 posts
    Member since:
    Nov 2007

    Posted 05 Aug 2009 Link to this post

    Has the framework been extended thus far to allow this to work without the windows events?

    I'm trying to drag from a treeview to the gridview and none of the gridview events are firing...

    please let me know

    thanks!
  15. Victor
    Admin
    Victor avatar
    1351 posts

    Posted 10 Aug 2009 Link to this post

    Hello Jure,

    Please elaborate on what do you mean by none of the gridview events are firing. I tested drag and drop between RadTreeView and RadGridView and it works correctly. Here is the code that I am testing, feel free to use it as needed:

    private void radGridView1_DragEnter(object sender, DragEventArgs e)  
    {  
        if (e.Data.GetDataPresent(typeof(string)))  
        {  
            e.Effect = DragDropEffects.Copy;  
        }  
        else 
        {  
            e.Effect = DragDropEffects.None;  
        }  
    }  
     
    private void radGridView1_DragDrop(object sender, DragEventArgs e)  
    {  
        GridViewRowInfo newRow = this.radGridView1.Rows.AddNew();  
        newRow.Cells[0].Value = e.Data.GetData(typeof(string));  
    }  
     
    private void radTreeView1_MouseDown(object sender, MouseEventArgs e)  
    {  
        RadTreeNode clickedNode = this.radTreeView1.GetNodeAt(e.X, e.Y);  
        if (clickedNode != null)  
        {  
            this.DoDragDrop(clickedNode.Text, DragDropEffects.Copy);  
        }  

    Basically the logic above copies the text from the dragged node and creates a new row in RadGridView assuming that the first column is GridViewTextBoxColumn. You can extend this example and use a custom data object which can contain all the necessary data to be transferred (not just the node text).

    As to the drag and drop framework, we decided that it is not essential to implement one yet since we have other priorities(code base stability and documentation) and that the standard drag and drop mechanism is easy enough to use. Write again if you need further assistance.

    Sincerely yours,
    Victor
    the Telerik team

    Check out Telerik Trainer, the state of the art learning tool for Telerik products.
  16. Jay
    Jay avatar
    25 posts
    Member since:
    Nov 2007

    Posted 09 Oct 2009 Link to this post

    Sorry for the late reply but was just able to get back onto this project.

    it works great!

    thanks for the posted code.

    Jay
  17. John Benny
    John Benny avatar
    2 posts
    Member since:
    Nov 2009

    Posted 13 Nov 2009 Link to this post

    hi

    I am writing C# win form.
    I have created user control for RadGrid and created one more usercontrol for RadTreeview.  I am using both these
    user control in my form. I need to drag item from grid to Tree view. How to do this? and How to raise these events.
    Please let me kow.

    regards,
    John
  18. Nikolay
    Admin
    Nikolay avatar
    1804 posts

    Posted 24 Nov 2009 Link to this post

    Hi John Benny,

    Could you please elaborate a bit more on the issues that you encounter? I am not sure that I undestand your question about raising the events.

    You can refer to the solutions that my colleagues Jordan and Victor have given in this forum thread. These snippets are tested and as you can see they are working for our clients. So, it should be something specific in your case that prevents you from using these solutions.

    Sincerely yours,
    Nikolay
    the Telerik team

    Instantly find answers to your questions on the new Telerik Support Portal.
    Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
  19. John Benny
    John Benny avatar
    2 posts
    Member since:
    Nov 2009

    Posted 24 Nov 2009 Link to this post

    hi,

    Thanks for your response.

    Sorry, it is my mistake. After i removed couple of code in my application, events is working fine.

    Thanks,

    John
Back to Top
UI for WinForms is Visual Studio 2017 Ready