Up and Down buttons

2 posts, 0 answers
  1. Art
    Art avatar
    54 posts
    Member since:
    Dec 2010

    Posted 03 Oct 2015 Link to this post

    Has anyone created a good way to have up and down button for a grid.

    I have a grid with a list of items that my user would want to order. When they click the Up button the grids current row moves up one row, trading placed with the row above it. Of course the opposite is true with the down button.

     I'm trying to use a "sort_order" column with numbers 1 through the childrow count. The buttons' click event edits the current gridrow and the one above it, changing their sort_order field accordingly. However, I'm running into problems when setting the column values. It seems as though I can change the current row, but when I change the previous row the current row's cell value changes back and the previous row doesn't change.

    Any ideas .. really, any ideas at all.

    Later

    Art

  2. Dess
    Admin
    Dess avatar
    1609 posts

    Posted 07 Oct 2015 Link to this post

    Hello Art,

    Thank you for writing.

    RadGridView manages user mouse and keyboard input over its rows by GridRowBehavior. Depending on the row type, RadGridView introduces different behaviors. If you need to customize the default behavior of the up/down arrow keys, you can create a derivative of the GridDataRowBehavior and override its ProcessUpKey and ProcessDownKey methods. Thus, you can perform rows reordering. Note that in bound mode you should reorder the data items in the source collection, not to reorder the associated grid rows. You can refer to Row behaviors help article for additional information. I have prepared a sample code snippet which result is illustrated on the attached gif file:
    public Form1()
    {
        InitializeComponent();
     
        List<Item> items = new List<Item>();
        for (int i = 0; i < 10; i++)
        {
            items.Add(new Item(i,"Item" + i));
        }
        this.radGridView1.DataSource = items;
        this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
         
        BaseGridBehavior gridBehavior = radGridView1.GridBehavior as BaseGridBehavior;
        gridBehavior.UnregisterBehavior(typeof(GridViewDataRowInfo));
        gridBehavior.RegisterBehavior(typeof(GridViewDataRowInfo), new CustomGridDataRowBehavior());
    }
     
    public class CustomGridDataRowBehavior : GridDataRowBehavior
    {
        protected override bool ProcessUpKey(KeyEventArgs keys)
        {
            List<Item> items = this.GridControl.DataSource as List<Item>;
            if (items != null && this.GridControl.CurrentRow != null)
            {
                Item currentItem = this.GridControl.CurrentRow.DataBoundItem as Item;
                int index = Math.Max(0, items.IndexOf(currentItem) - 1);
                this.GridControl.DataSource = null;
                items.Remove(currentItem);
                items.Insert(index, currentItem);
                this.GridControl.DataSource = items;
                this.GridControl.CurrentRow = this.GridControl.Rows[index];
            }
     
            return true;
        }
     
        protected override bool ProcessDownKey(KeyEventArgs keys)
        {
            List<Item> items = this.GridControl.DataSource as List<Item>;
            if (items != null && this.GridControl.CurrentRow != null)
            {
                Item currentItem = this.GridControl.CurrentRow.DataBoundItem as Item;
                int index = Math.Min(items.Count - 1, items.IndexOf(currentItem) + 1);
                this.GridControl.DataSource = null;
                items.Remove(currentItem);
                items.Insert(index, currentItem);
                this.GridControl.DataSource = items;
                this.GridControl.CurrentRow = this.GridControl.Rows[index];
            }
     
            return true;
        }
    }
     
    public class Item
    {
        public int Id { get; set; }
     
        public string Title { get; set; }
     
        public Item(int id, string title)
        {
            this.Id = id;
            this.Title = title;
        }
    }

    Note that this is just a sample approach and it may not cover all possible cases. Feel free to modify it in a way which suits your requirement best.
     
    I hope this information helps. Should you have further questions I would be glad to help.
     
    Regards,
    Dess
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  3. UI for WinForms is Visual Studio 2017 Ready
Back to Top