Move rows with the mouse

5 posts, 2 answers
  1. FMorales
    FMorales avatar
    26 posts
    Member since:
    Aug 2014

    Posted 24 Oct 2014 Link to this post

    Hi

    anybody knows if the grid support to move rows natively with the mouse?

    I need to click with the mouse on a groups of rows and move them to another position in the same grid (drag and drop)

    Could anybody share an example?

    Thanks a lot.

    Francisco
  2. Answer
    Dess
    Admin
    Dess avatar
    1608 posts

    Posted 28 Oct 2014 Link to this post

    Hello Francisco,

    Thank you for writing.

    RadGridViewDragDropService allows you to implement the desired drag and drop functionality within the same grid. Our GridView >> Drag and Drop help article is quite useful on this topic. Following the introduced approach I have achieved the desired functionality. Here is the same code snippet:
    public partial class Form1 : Form
    {
        BindingList<Color> colors = new BindingList<Color>()
        {
            Color.Red, Color.Blue, Color.Green, Color.Yellow,
            Color.Fuchsia, Color.Orange, Color.Purple
        };
     
        public Form1()
        {
            InitializeComponent();
     
            this.radGridView1.DataSource = colors;
            this.radGridView1.AllowRowReorder = true;
            this.radGridView1.AllowColumnReorder = true;
            this.radGridView1.SelectionMode = GridViewSelectionMode.FullRowSelect;
            this.radGridView1.MultiSelect = true;
            this.radGridView1.CurrentRow = null;
             
            RadDragDropService svc = this.radGridView1.GridViewElement.GetService<RadDragDropService>();
            svc.PreviewDragStart += svc_PreviewDragStart;
            svc.PreviewDragDrop += svc_PreviewDragDrop;
            svc.PreviewDragOver += svc_PreviewDragOver;
     
            //register the custom row selection behavior
            var gridBehavior = this.radGridView1.GridBehavior as BaseGridBehavior;
            gridBehavior.UnregisterBehavior(typeof(GridViewDataRowInfo));
            gridBehavior.RegisterBehavior(typeof(GridViewDataRowInfo),
                new RowSelectionGridBehavior());
        }
         
        private void svc_PreviewDragOver(object sender, RadDragOverEventArgs e)
        {
            if (e.DragInstance is GridDataRowElement)
            {
                e.CanDrop = e.HitTarget is GridDataRowElement ||
                            e.HitTarget is GridTableElement ||
                            e.HitTarget is GridSummaryRowElement;
            }
        }
     
        //initiate the move of selected row
        private void svc_PreviewDragDrop(object sender, RadDropEventArgs e)
        {
            GridDataRowElement rowElement = e.DragInstance as GridDataRowElement;
     
            if (rowElement == null)
            {
                return;
            }
            e.Handled = true;
     
            RadItem dropTarget = e.HitTarget as RadItem;
            RadGridView targetGrid = dropTarget.ElementTree.Control as RadGridView;
            if (targetGrid == null)
            {
                return;
            }
     
            var dragGrid = rowElement.ElementTree.Control as RadGridView;
            if (targetGrid == dragGrid)
            {
                e.Handled = true;
     
                GridDataRowElement dropTargetRow = dropTarget as GridDataRowElement;
                int index = dropTargetRow != null ? this.GetTargetRowIndex(dropTargetRow, e.DropLocation) : targetGrid.RowCount;
              
                this.MoveRows(dragGrid, dragGrid.SelectedRows, index);
            }
        }
     
        private int GetTargetRowIndex(GridDataRowElement row, Point dropLocation)
        {
            int halfHeight = row.Size.Height / 2;
            int index = row.RowInfo.Index;
            if (dropLocation.Y > halfHeight)
            {
                index++;
            }
            return index;
        }
     
        //required to initiate drag and drop when grid is in bound mode
        private void svc_PreviewDragStart(object sender, PreviewDragStartEventArgs e)
        {
            e.CanStart = true;
        }
     
        private void MoveRows(RadGridView dragGrid,
            GridViewSelectedRowsCollection selectedRows, int index)
        {
            dragGrid.BeginUpdate();
        
            if (dragGrid.DataSource != null && typeof(IList).IsAssignableFrom(dragGrid.DataSource.GetType()))
            {
                //bound to a list of objects scenario
                var sourceCollection = (IList)dragGrid.DataSource;
                for (int i = selectedRows.Count - 1; i >= 0; i--)
                {
                    GridViewRowInfo row = selectedRows[i];
                
                    if (row is GridViewSummaryRowInfo)
                    {
                        return;
                    }
                    if (row.Index < index)
                    {
                        index--;
                    }
                    sourceCollection.Remove(row.DataBoundItem);                   
                    sourceCollection.Insert(index, row.DataBoundItem);
                }
            }
            else
            {
                throw new ApplicationException("Unhandled Scenario");
            }
                         
            dragGrid.EndUpdate(true);
        }
    }
     
    //initiates drag and drop service for clicked rows
    public class RowSelectionGridBehavior : GridDataRowBehavior
    {
        protected override bool OnMouseDownLeft(MouseEventArgs e)
        {
            GridDataRowElement row = this.GetRowAtPoint(e.Location) as GridDataRowElement;
            if (row != null)
            {
                RadGridViewDragDropService svc =
                    this.GridViewElement.GetService<RadGridViewDragDropService>();
                svc.Start(row);
            }
            return base.OnMouseDownLeft(e);
        }
    }

    Note that this is just an example and it may not cover all possible cases. Feel free to modify it on a way which suits your requirements best.

    I hope this information helps. Should you have further questions, I would be glad to help.

    Regards,
    Desislava
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
  3. UI for WinForms is Visual Studio 2017 Ready
  4. FMorales
    FMorales avatar
    26 posts
    Member since:
    Aug 2014

    Posted 29 Oct 2014 in reply to Dess Link to this post

    Hi Desislava,

    I have implemented the solution in my grid and all works fine but I can only move one row each time, I can select various rows with the mouse but whrn I click to move them, it select just one row and allow me to move just the one selected row.

    What I am doing wrong?

    Thanks a million

    Francisco Morales

  5. Answer
    Dess
    Admin
    Dess avatar
    1608 posts

    Posted 03 Nov 2014 Link to this post

    Hello Francisco,

    Thank you for writing back.

    I am glad that the suggested solution suits your requirement. As to the multiple selection, it is necessary to hold the Ctrl key while dragging the selected rows. Thus, you will be able to keep the selection and perform drag and drop operation for more than one row.

    I hope this information helps. If you have any additional questions, please let me know.

    Regards,
    Desislava
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
  6. FMorales
    FMorales avatar
    26 posts
    Member since:
    Aug 2014

    Posted 03 Nov 2014 in reply to Dess Link to this post

    Hi Desislava,

    thank you very much for your support, yes, I discovered it las week :)

    All fworks fine.

    Thanks

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