Steve Holdorf
Top achievements
Rank 1
Steve Holdorf
asked on 20 Jul 2012, 05:52 PM
I am using AjAX RAD CONTROLS 2012. I have a radgrid setup with a master/details hierarchy and everything works well. Also note that in the details row I have a details table with a button. When the button is presses it fires the OnItemCommand. The only problem is that when The OnItemCommand event command fires with the master/details hierarchy opened and in the OnItemCommand event a call to the grid’s rebind method the hierarchy collapses. What is the best way to keep the master/details stay opened on a rebind?
Thanks for all of your help.
Steve Holdorf
Thanks for all of your help.
Steve Holdorf
7 Answers, 1 is accepted
0
Shinu
Top achievements
Rank 2
answered on 23 Jul 2012, 07:00 AM
Hi Steve Holdorf,
Please take a look into the following code snippet to retain expanded/selected state in hierarchy on rebind.
ASPX:
C#:
Please check this code library for more details.
Thanks,
Shinu.
Please take a look into the following code snippet to retain expanded/selected state in hierarchy on rebind.
ASPX:
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings></telerik:RadAjaxManager><asp:Button ID="grdRebind" runat="server" Text="Rebind grid" OnClick="grdRebind_Click" /><telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" /><telerik:RadGrid ID="RadGrid1" DataSourceID="SqlDataSource1" runat="server" AutoGenerateColumns="False" AllowSorting="True" AllowMultiRowSelection="true" OnDataBound="RadGrid1_DataBound" OnItemCommand="RadGrid1_ItemCommand"> <MasterTableView DataSourceID="SqlDataSource1" DataKeyNames="CustomerID" CommandItemDisplay="Top"> <DetailTables> <telerik:GridTableView DataKeyNames="OrderID" DataSourceID="SqlDataSource2" runat="server" CommandItemDisplay="Top"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="CustomerID" MasterKeyField="CustomerID" /> </ParentTableRelation> <Columns> <telerik:GridBoundColumn SortExpression="OrderID" HeaderText="OrderID" HeaderButtonType="TextButton" DataField="OrderID" UniqueName="OrderID"> </telerik:GridBoundColumn> <telerik:GridBoundColumn SortExpression="EmployeeID" HeaderText="EmployeeID" HeaderButtonType="TextButton" DataField="EmployeeID" UniqueName="EmployeeID"> </telerik:GridBoundColumn> <telerik:GridButtonColumn UniqueName="OrdersSelectColumn" CommandName="Select" Text="Select" /> <telerik:GridButtonColumn UniqueName="OrdersDeselectColumn" CommandName="Deselect" Text="Deselect" /> </Columns> </telerik:GridTableView> </DetailTables> <Columns> <telerik:GridBoundColumn SortExpression="CustomerID" HeaderText="CustomerID" HeaderButtonType="TextButton" DataField="CustomerID" UniqueName="CustomerID"> </telerik:GridBoundColumn> <telerik:GridBoundColumn SortExpression="ContactName" HeaderText="Contact Name" HeaderButtonType="TextButton" DataField="ContactName" UniqueName="ContactName"> </telerik:GridBoundColumn> <telerik:GridButtonColumn UniqueName="CustomersSelectColumn" CommandName="Select" Text="Select" /> <telerik:GridButtonColumn UniqueName="CustomersSelectColumn" CommandName="Deselect" Text="Deselect" /> </Columns> </MasterTableView></telerik:RadGrid>C#:
private Hashtable _ordersExpandedState;private Hashtable _selectedState; public void Page_Load(object sender, EventArgs e){ if (!IsPostBack) { //reset states this._ordersExpandedState = null; this.Session["_ordersExpandedState"] = null; this._selectedState = null; this.Session["_selectedState"] = null; }}//Save/load expanded states Hash from the session//this can also be implemented in the ViewStateprivate Hashtable ExpandedStates{ get { if (this._ordersExpandedState == null) { _ordersExpandedState = this.Session["_ordersExpandedState"] as Hashtable; if (_ordersExpandedState == null) { _ordersExpandedState = new Hashtable(); this.Session["_ordersExpandedState"] = _ordersExpandedState; } } return this._ordersExpandedState; }} //Clear the state for all expanded children if a parent item is collapsedprivate void ClearExpandedChildren(string parentHierarchicalIndex){ string[] indexes = new string[this.ExpandedStates.Keys.Count]; this.ExpandedStates.Keys.CopyTo(indexes, 0); foreach (string index in indexes) { //all indexes of child items if (index.StartsWith(parentHierarchicalIndex + "_") || index.StartsWith(parentHierarchicalIndex + ":")) { this.ExpandedStates.Remove(index); } }} private void ClearSelectedChildren(string parentHierarchicalIndex){ string[] indexes = new string[this.SelectedStates.Keys.Count]; this.SelectedStates.Keys.CopyTo(indexes, 0); foreach (string index in indexes) { //all indexes of child items if (index.StartsWith(parentHierarchicalIndex + "_") || index.StartsWith(parentHierarchicalIndex + ":")) { this.SelectedStates.Remove(index); } }} //Save/load selected states Hash from the session//this can also be implemented in the ViewStateprivate Hashtable SelectedStates{ get { if (this._selectedState == null) { _selectedState = this.Session["_selectedState"] as Hashtable; if (_selectedState == null) { _selectedState = new Hashtable(); this.Session["_selectedState"] = _selectedState; } } return this._selectedState; }}protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e){ //save the expanded/selected state in the session if (e.CommandName == RadGrid.ExpandCollapseCommandName) { //Is the item about to be expanded or collapsed if (!e.Item.Expanded) { //Save its unique index among all the items in the hierarchy this.ExpandedStates[e.Item.ItemIndexHierarchical] = true; } else //collapsed { this.ExpandedStates.Remove(e.Item.ItemIndexHierarchical); this.ClearSelectedChildren(e.Item.ItemIndexHierarchical); this.ClearExpandedChildren(e.Item.ItemIndexHierarchical); } } //Is the item about to be selected else if (e.CommandName == RadGrid.SelectCommandName) { //Save its unique index among all the items in the hierarchy this.SelectedStates[e.Item.ItemIndexHierarchical] = true; } //Is the item about to be deselected else if (e.CommandName == RadGrid.DeselectCommandName) { this.SelectedStates.Remove(e.Item.ItemIndexHierarchical); }}protected void RadGrid1_DataBound(object sender, EventArgs e){ //Expand all items using our custom storage string[] indexes = new string[this.ExpandedStates.Keys.Count]; this.ExpandedStates.Keys.CopyTo(indexes, 0); ArrayList arr = new ArrayList(indexes); //Sort so we can guarantee that a parent item is expanded before any of //its children arr.Sort(); foreach (string key in arr) { bool value = (bool)this.ExpandedStates[key]; if (value) { RadGrid1.Items[key].Expanded = true; } } //Select all items using our custom storage indexes = new string[this.SelectedStates.Keys.Count]; this.SelectedStates.Keys.CopyTo(indexes, 0); arr = new ArrayList(indexes); //Sort to ensure that a parent item is selected before any of its children arr.Sort(); foreach (string key in arr) { bool value = (bool)this.SelectedStates[key]; if (value) { RadGrid1.Items[key].Selected = true; } }}Please check this code library for more details.
Thanks,
Shinu.
0
Steve Holdorf
Top achievements
Rank 1
answered on 24 Jul 2012, 10:46 AM
Your code worked great!
Thanks,
Steve Holdorf
Thanks,
Steve Holdorf
0
Tim Black
Top achievements
Rank 1
answered on 22 Jan 2013, 07:11 PM
I just came across this solution and wanted to thank you. It worked great!!
0
Kiko
Top achievements
Rank 1
answered on 24 Sep 2014, 04:05 PM
I tried this on my first attempt to use parent and child grid, and it worked perfectly. thank you for support systems like this. thank you.
0
Shraddha
Top achievements
Rank 1
answered on 23 Dec 2014, 09:12 AM
this is really great piece of code works well . Thankyou
0
Hello Shraddha,
Recently, a new property was introduced to achieve this implementation:
Hope this helps.
Regards,
Eyup
Telerik
Recently, a new property was introduced to achieve this implementation:
<MasterTableView ... RetainExpandStateOnRebind="true">Hope this helps.
Regards,
Eyup
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.
0
Abhishek
Top achievements
Rank 1
answered on 08 Oct 2015, 07:37 AM
Thank you Shraddha.... it worked just fine for 3-level grid too..
