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);
}
11 Answers, 1 is accepted
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
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.
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
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();
}
//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
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
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;
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.
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);
}
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.
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.
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.