scroll bar position after refreshing grid

12 posts, 1 answers
  1. muralidhar
    muralidhar avatar
    12 posts
    Member since:
    Jan 2011

    Posted 08 Mar 2012 Link to this post

    Hi,

    I am working on the hierarchical grid and displaying data using self references.

    My requirement is when i refresh the grid then the selectd row should be selected and the scroll bar
    position should be at the same location but now when i refresh the scroll bar is moved to top of the grid.

    could you please help me on the above requirement?

    Thanks & Regards
    Muralidhar Dasari

    Code Snippet for refresh:- 
    using (radGridView1.DeferRefresh())
      {
        this.radGridView1.TableElement.Update(GridUINotifyAction.DataChanged);
        this.radGridView1.TableElement.Update(GridUINotifyAction.StateChanged);
    }
  2. Svett
    Admin
    Svett avatar
    728 posts

    Posted 13 Mar 2012 Link to this post

    Hi Muralidhar,

    When you are using the DeferRefresh method, you are causing the RadGridView control to reset its visual state. Then it sets the scroll-bar position in the initial state. You should use only the code snippet below:

    this.radGridView1.TableElement.Update(GridUINotifyAction.DataChanged);
    this.radGridView1.TableElement.Update(GridUINotifyAction.StateChanged);

    I hope this helps.

    All the best,
    Svett
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
  3. muralidhar
    muralidhar avatar
    12 posts
    Member since:
    Jan 2011

    Posted 14 Mar 2012 Link to this post

    Hi,

    Thanks for the response, it is working fine if i have no new rows in my data source but if new rows are there in my grid after refresh then the scroll bar is moved to last last row of the grid.

    can you help me in positioning the scroll bar at the same location?

    Thanks & Regards
    Muralidhar Dasari.

     

  4. Svett
    Admin
    Svett avatar
    728 posts

    Posted 16 Mar 2012 Link to this post

    Hi Muralidhar,

    I am not able to assist you efficiently with the supplied information. Would you pelase share with us the full code snippet where you are using the Update method of GridViewTableElement? Hence, we will understand your scenario in depth and will be able to assist you.

    All the best,
    Svett
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
  5. muralidhar
    muralidhar avatar
    12 posts
    Member since:
    Jan 2011

    Posted 19 Mar 2012 Link to this post

    Hi,

    I am displayed the data in the grid in  hierarchical format.
    I have a button on the form to refresh the data in the grid but the grid is always scrolled to first postion after refresh.
    private static DataTable CreateDataSource() 
            
                DataTable dataSource = new DataTable("fileSystem");
                dataSource.Columns.Add("ID", typeof(int));
                dataSource.Columns.Add("ParentID", typeof(int));
                dataSource.Columns.Add("Name", typeof(string)); 
                dataSource.Columns.Add("Date", typeof(DateTime));
                dataSource.Columns.Add("Type", typeof(string)); 
                dataSource.Columns.Add("Size", typeof(int)); 
                dataSource.Rows.Add(1, null, "Program Files", DateTime.Now.AddDays(-100), "Folder", 5120); 
                dataSource.Rows.Add(2, 1, "Visual Studio 2010", DateTime.Now.AddDays(-100), "Folder", 3220); 
                dataSource.Rows.Add(3, 2, "bin", DateTime.Now.AddDays(-100), "Folder", 3220); 
                dataSource.Rows.Add(4, 2, "READEME.txt", DateTime.Now.AddDays(-100), "Text Document", 3); 
                dataSource.Rows.Add(5, 1, "Telerik RadControls", DateTime.Now.AddDays(-10), "Folder", 3120); 
                dataSource.Rows.Add(6, 5, "RadControls for Winforms", DateTime.Now.AddDays(-10), "Folder", 101); 
                dataSource.Rows.Add(7, 5, "RadControls for Silverlight", DateTime.Now.AddDays(-10), "Folder", 123); 
                dataSource.Rows.Add(8, 5, "RadControls for WPF", DateTime.Now.AddDays(-10), "Folder", 221);
                dataSource.Rows.Add(9, 5, "RadControls for ASP.NET AJAX", DateTime.Now.AddDays(-10), "Folder", 121); 
                dataSource.Rows.Add(10, 1, "Microsoft Office 2010", DateTime.Now.AddDays(-120), "Folder", 1230);
                dataSource.Rows.Add(11, 10, "Microsoft Word 2010", DateTime.Now.AddDays(-120), "Folder", 1230); 
                dataSource.Rows.Add(12, 10, "Microsoft Excel 2010", DateTime.Now.AddDays(-120), "Folder", 1230); 
                dataSource.Rows.Add(13, 10, "Microsoft Powerpoint 2010", DateTime.Now.AddDays(-120), "Folder", 1230); 
                dataSource.Rows.Add(14, 1, "Debug Diagnostic Tools v1.0", DateTime.Now.AddDays(-400), "Folder", 2120); 
                dataSource.Rows.Add(15, 1, "Designer's 3D Tools", DateTime.Now.AddDays(-500), "Folder", 1120); 
                dataSource.Rows.Add(16, 1, "Communication", DateTime.Now.AddDays(-700), "Folder", 120);
                dataSource.Rows.Add(17, null, "My Documents", DateTime.Now.AddDays(-200), "Folder", 1024);
                dataSource.Rows.Add(18, 17, "Salaries.xlsx", DateTime.Now.AddDays(-200), "Excel File", 1); 
                dataSource.Rows.Add(19, 17, "RecessionAnalysis.xlsx", DateTime.Now.AddDays(-200), "Excel File", 1);
                dataSource.Rows.Add(20, null, "Windows", DateTime.Now.AddDays(-100), "Folder", 10240); 
                dataSource.Rows.Add(21, 20, "System32", DateTime.Now.AddDays(-220), "Folder", 510); 
                dataSource.Rows.Add(22, 20, "assembly", DateTime.Now.AddDays(-20), "Folder", 240); 
                dataSource.Rows.Add(23, 22, "System.Data.dll", DateTime.Now.AddDays(-20), "Assembly File", 4); 
                dataSource.Rows.Add(24, 22, "System.Core.dll", DateTime.Now.AddDays(-20), "Assembly File", 2); 
                dataSource.Rows.Add(25, 22, "System.Drawings.dll", DateTime.Now.AddDays(-20), "Assembly File", 3); 
                dataSource.Rows.Add(26, 22, "Telerik.WinControls.UI.dll", DateTime.Now.AddDays(-20), "Assembly File", 5);
                dataSource.Rows.Add(27, null, "Users", DateTime.Now.AddDays(-100), "Folder", 5512);
                dataSource.Rows.Add(28, 27, "Administrator", DateTime.Now.AddDays(-100), "Folder", 1512); 
                dataSource.Rows.Add(29, 27, "Guest", DateTime.Now.AddDays(-100), "Folder", 2512);
                dataSource.Rows.Add(30, 27, "User1", DateTime.Now.AddDays(-100), "Folder", 3512);
                dataSource.Rows.Add(31, null, "Share", DateTime.Now.AddDays(-50), "Folder", 15360); 
                dataSource.Rows.Add(32, 31, "Photos", DateTime.Now.AddDays(-50), "Folder", 360);
                dataSource.Rows.Add(33, 32, "Flowers.JPG", DateTime.Now.AddDays(-50), "JPEG File", 1);
                dataSource.Rows.Add(34, 32, "Panda.GIF", DateTime.Now.AddDays(-50), "GIF File", 3); 
                dataSource.Rows.Add(35, 32, "Landscape.png", DateTime.Now.AddDays(-50), "PNG File", 4); 
                dataSource.Rows.Add(36, null, "Music", DateTime.Now.AddDays(-2), "Folder", 0); 
                dataSource.Rows.Add(37, 36, "Mozart", DateTime.Now.AddDays(-3), "Folder", 0); 
                dataSource.Rows.Add(38, 36, "Pavarotti", DateTime.Now.AddDays(-40), "Folder", 0); 
                dataSource.Rows.Add(39, 36, "AC/DC", DateTime.Now.AddDays(-50), "Folder", 0); 
                dataSource.Rows.Add(40, 36, "Queen", DateTime.Now.AddDays(-8), "Folder", 0); 
                dataSource.Rows.Add(33, null, "Boot.ini", DateTime.Now.AddDays(-10), "INI File", 0);
      
      
      
                dataSource.Rows.Add(41, null, "Music1", DateTime.Now.AddDays(-2), "Folder", 0);
                dataSource.Rows.Add(42, 41, "Mozart1", DateTime.Now.AddDays(-3), "Folder", 0);
                dataSource.Rows.Add(43, 41, "Pavarotti1", DateTime.Now.AddDays(-40), "Folder", 0);
                dataSource.Rows.Add(44, 41, "AC/DC1", DateTime.Now.AddDays(-50), "Folder", 0);
                dataSource.Rows.Add(45, 41, "Queen1", DateTime.Now.AddDays(-8), "Folder", 0);
               
      
      
                dataSource.Rows.Add(46, null, "Music2", DateTime.Now.AddDays(-2), "Folder", 0);
                dataSource.Rows.Add(47, 46, "Mozart2", DateTime.Now.AddDays(-3), "Folder", 0);
                dataSource.Rows.Add(48, 46, "Pavarotti2", DateTime.Now.AddDays(-40), "Folder", 0);
                dataSource.Rows.Add(49, 46, "AC/DC2", DateTime.Now.AddDays(-50), "Folder", 0);
                dataSource.Rows.Add(50, 46, "Queen2", DateTime.Now.AddDays(-8), "Folder", 0);
      
      
                dataSource.Rows.Add(51, null, "Murali 3", DateTime.Now.AddDays(-2), "Folder", 0);
                dataSource.Rows.Add(52, 51, "Mozart 3", DateTime.Now.AddDays(-3), "Folder", 0);
                dataSource.Rows.Add(53, 51, "Pavarotti 3", DateTime.Now.AddDays(-40), "Folder", 0);
                dataSource.Rows.Add(54, 51, "AC/DC2 3", DateTime.Now.AddDays(-50), "Folder", 0);
                dataSource.Rows.Add(55, 51, "Queen 3", DateTime.Now.AddDays(-8), "Folder", 0);
      
      
                dataSource.Rows.Add(56, null, "Murali 4", DateTime.Now.AddDays(-2), "Folder", 0);
                dataSource.Rows.Add(57, 56, "Mozart 3", DateTime.Now.AddDays(-3), "Folder", 0);
                dataSource.Rows.Add(58, 56, "Pavarotti 3", DateTime.Now.AddDays(-40), "Folder", 0);
                dataSource.Rows.Add(59, 56, "AC/DC2 3", DateTime.Now.AddDays(-50), "Folder", 0);
                dataSource.Rows.Add(60, 56, "Queen 3", DateTime.Now.AddDays(-8), "Folder", 0);
      
                dataSource.Rows.Add(61, null, "Murali 5", DateTime.Now.AddDays(-2), "Folder", 0);
                dataSource.Rows.Add(62, 61, "Mozart 3", DateTime.Now.AddDays(-3), "Folder", 0);
                dataSource.Rows.Add(63, 61, "Pavarotti 3", DateTime.Now.AddDays(-40), "Folder", 0);
                dataSource.Rows.Add(64, 61, "AC/DC2 3", DateTime.Now.AddDays(-50), "Folder", 0);
                dataSource.Rows.Add(65, 61, "Queen 3", DateTime.Now.AddDays(-8), "Folder", 0);
      
                return dataSource; 
            }
    private void Form1_Load(object sender, EventArgs e)
            {
     this.radGridView1.AllowAddNewRow = false;
                this.radGridView1.EnableFiltering = true;
                   
                this.radGridView1.MasterTemplate.ShowHeaderCellButtons = true; 
                this.radGridView1.MasterTemplate.ShowFilteringRow = false; 
                this.radGridView1.TableElement.RowHeight = 40;
                this.radGridView1.ViewCellFormatting += new CellFormattingEventHandler(radGridView1_ViewCellFormatting);
                this.radGridView1.CellFormatting += new CellFormattingEventHandler(radGridView1_CellFormatting);
                this.radGridView1.ReadOnly = true;
                this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
                this.radGridView1.AutoGenerateColumns = false;
                _dataTable = CreateDataSource();
                this.radGridView1.DataSource = _dataTable;
                this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "ID", "ParentID"); 
                this.radGridView1.Columns["ID"].IsVisible = false;
                this.radGridView1.Columns["ParentID"].IsVisible = false;
                this.radGridView1.Columns["Size"].FormatString = "{0} MB";
                this.radGridView1.MasterTemplate.ExpandAll();
    }
    In Button click i have written the below code:-
    //Refresh
            private void button3_Click(object sender, EventArgs e)
            {
     _dataTable.Rows.Add(66, null, "Murali 3", DateTime.Now.AddDays(-2), "Folder", 0);
                _dataTable.Rows.Add(67, 66, "Mozart 3", DateTime.Now.AddDays(-3), "Folder", 0);
                _dataTable.Rows.Add(68, 66, "Pavarotti 3", DateTime.Now.AddDays(-40), "Folder", 0);
                _dataTable.Rows.Add(69, 66, "AC/DC2 3", DateTime.Now.AddDays(-50), "Folder", 0);
                _dataTable.Rows.Add(70, 66, "Queen 3", DateTime.Now.AddDays(-8), "Folder", 0);
      this.radGridView1.TableElement.Update(GridUINotifyAction.DataChanged);
                this.radGridView1.TableElement.Update(GridUINotifyAction.StateChanged);
    }

    when i click the button then the grid is scrolled to top of the screen but i want the scroll bar to remain at the same position.

    Thanks & Regards
    Muralidhar Dasari


  6. Answer
    Svett
    Admin
    Svett avatar
    728 posts

    Posted 21 Mar 2012 Link to this post

    Hi Muralidhar,

    This is the expected behavior. Nevertheless, you can change it by using the following code snippet in the button click event handler:

    RadScrollBarElement vScrollBar = this.radGridView1.TableElement.VScrollBar;
    int scrollBarValue = vScrollBar.Value;
     
    _dataTable.Rows.Add(66, null, "Murali 3", DateTime.Now.AddDays(-2), "Folder", 0);
    _dataTable.Rows.Add(67, 66, "Mozart 3", DateTime.Now.AddDays(-3), "Folder", 0);
    _dataTable.Rows.Add(68, 66, "Pavarotti 3", DateTime.Now.AddDays(-40), "Folder", 0);
    _dataTable.Rows.Add(69, 66, "AC/DC2 3", DateTime.Now.AddDays(-50), "Folder", 0);
    _dataTable.Rows.Add(70, 66, "Queen 3", DateTime.Now.AddDays(-8), "Folder", 0);
    this.radGridView1.TableElement.Update(GridUINotifyAction.DataChanged);
    this.radGridView1.TableElement.Update(GridUINotifyAction.StateChanged);
    this.radGridView1.TableElement.RowScroller.UpdateScrollRange();
     
    this.radGridView1.TableElement.VScrollBar.Value = this.ClampValue(scrollBarValue,
                                            vScrollBar.Minimum,
                                            vScrollBar.Maximum - vScrollBar.LargeChange + 1);

    private int ClampValue(int value, int minimum, int maximum)
    {
        if (value < minimum)
        {
            return minimum;
        }
        if (maximum > 0 && value > maximum)
        {
            return maximum;
        }
        return value;
    }

    I hope this helps.

    All the best,
    Svett
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
  7. Guy
    Guy avatar
    6 posts
    Member since:
    May 2014

    Posted 01 Nov 2014 in reply to Svett Link to this post

    Hi Svett,
    I'm referring to your solution for scrolling correctly after data update. That's work perfectly...but

     I've an additional issue i.e. when sorting the column A or c... (with headers column)  before updating .
    Let us say I update one row and then my LinQ Query  restores the data grid sorted by Column B.
    When updating and scrolling, it's referring to a VscrollBar.Value that's nothing to do with the original sorted state.

    I understand this behaviour is normal but how can I cope with this  in order to  programmatically retrieve the sorted view and/or  the correct position row after refreshing the data grid.

    Thanks for your help.
    regards.



    RadScrollBarElement vScrollBar = this.radGridView1.TableElement.VScrollBar;
    int scrollBarValue = vScrollBar.Value;
  8. George
    Admin
    George avatar
    500 posts

    Posted 05 Nov 2014 Link to this post

    Hi Guy,

    Thank you for writing.

    I do not think that I understood your question from the provided information. Can you please provide a more detailed information about the scenario at hand? Some specific steps would be very helpful.

    Looking forward to your reply.

    Regards,
    George
    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.

     
  9. Guy
    Guy avatar
    6 posts
    Member since:
    May 2014

    Posted 06 Nov 2014 in reply to George Link to this post

    Here is my issue. I built a small app. based on previous data in these post. 

    When I click  to "Add lines" , I've no problem and the solution explained before worked perfectly, retrieving the selected rows even if it is sorted .
    Now, I want to update my data source (here the table but could be a linQ Query or anything else) and I click the radButton2
     I lost my selected row. Maybe this procedure does not suit this case, and I should keep the ID  line selected and try to retrieve this ID line when I recover the data grid ?Any idea is welcome to solve this.
    private void radButton2_Click(object sender, EventArgs e)
    {
        // to reload the datatable
        RadScrollBarElement vScrollBar = this.radGridView1.TableElement.VScrollBar;
        int scrollBarValue = vScrollBar.Value;
     
        DataTable _dataTable = new DataTable();
       
        // here should come some updates in the table and then reload  to datagrid
        _dataTable = CreateDataSource();
     
        this.radGridView1.DataSource = _dataTable;
     
        this.radGridView1.MasterTemplate.ExpandAll();
     
        this.radGridView1.TableElement.Update(GridUINotifyAction.DataChanged);
        this.radGridView1.TableElement.Update(GridUINotifyAction.StateChanged);
        this.radGridView1.TableElement.RowScroller.UpdateScrollRange();
     
        this.radGridView1.TableElement.VScrollBar.Value = this.ClampValue(scrollBarValue,
                                                vScrollBar.Minimum,
                                                vScrollBar.Maximum - vScrollBar.LargeChange + 1);
     
    }
  10. George
    Admin
    George avatar
    500 posts

    Posted 11 Nov 2014 Link to this post

    Hello Guy,

    Thank you for your reply.

    You can save the selected index of the row and set it after the data is reloaded:
    private void Button_Click1(object sender, EventArgs e)
    {
        int index = this.Grid.CurrentRow.Index;
     
        //load the data
     
        this.Grid.CurrentRow = this.Grid.Rows[index];
    }

    I hope this will help.

    Regards,
    George
    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.

     
  11. Guy
    Guy avatar
    6 posts
    Member since:
    May 2014

    Posted 11 Nov 2014 in reply to George Link to this post

    Hi George,
    thanks for your answer but your solution doesn't work and I don't know why because it seems to be so simple.
    here is my code modified with your recommendation. 
                    int index = this.radGridView1.CurrentRow.Index;
                RadMessageBox.Show("Index = " + index );
                DataTable _dataTable = new DataTable();
                _dataTable = CreateDataSource();
                this.radGridView1.DataSource = _dataTable;
                this.radGridView1.MasterTemplate.ExpandAll();
                this.radGridView1.CurrentRow = this.radGridView1.Rows[index];

    I've insert a message Box to see the index and as you can see in the attach image, this index is not relevant. when I reload the grid I'm positioned on the fifth line which is not the previous one.
    I don't understand. !
     Thanks for your support. Best regards.

  12. George
    Admin
    George avatar
    500 posts

    Posted 14 Nov 2014 Link to this post

    Hello Guy,

    Thank you for your reply.

    You can find attached a project which saves the current row and after the grid has its data source changed the same row is selected. Let me know if there is anything that I am missing. If you need to attach a sample project, feel free to submit a new support ticket.

    Looking forward to your reply.

    Regards,
    George
    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.

     
Back to Top