Bill O'Neil
Top achievements
Rank 1
Bill O'Neil
asked on 11 Dec 2015, 09:37 PM
the most common request we get when it comes to our (rather heavy) use of RadGrid is to allow users to save which columns are visible on the grid (when we allow users to show/hide columns using the contextheader.)
What would be the best method to do this? Is RadPersistenceFramework overkill (does it even allow this?)
Or should we cook up something using custom javascript? No other settings (page, sort, etc) - just toggling the initial "display" setting for various columns.
Thoughts?
3 Answers, 1 is accepted
0
Hi Bill,
As demonstrated in the following online demo, the RadPersistenceManager will store the visibility of the columns when you use the HeaderContextMenu for hiding/showing the columns and after you click on the Save button:
Although that the demo does not match your exact requirement, you can easily modify it. What you will have to do is to save the state of the grid after you hide or show a column through the HeaderContextMenu. In order to do that you could handle the client-side OnColumnShown and OnColumnHidden events and initiate a postback where you could save the grid state through the RadPersistanceManager. However, this approach will initiate a postback on each column action, so it is not user friendly.
For your convenience, following is a very simple example demonstrating how to achieve the same by handling the Hidden event of the RadContextMenu and initiate a postback through a hidden RadButton:
And the code-behind:
Hope this helps.
Regards,
Konstantin Dikov
Telerik
As demonstrated in the following online demo, the RadPersistenceManager will store the visibility of the columns when you use the HeaderContextMenu for hiding/showing the columns and after you click on the Save button:
Although that the demo does not match your exact requirement, you can easily modify it. What you will have to do is to save the state of the grid after you hide or show a column through the HeaderContextMenu. In order to do that you could handle the client-side OnColumnShown and OnColumnHidden events and initiate a postback where you could save the grid state through the RadPersistanceManager. However, this approach will initiate a postback on each column action, so it is not user friendly.
For your convenience, following is a very simple example demonstrating how to achieve the same by handling the Hidden event of the RadContextMenu and initiate a postback through a hidden RadButton:
<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"> <script type="text/javascript"> function initiateSaveState(sender, args) { $find("<%=DummyButton1.ClientID%>").click(); } function menuShowing(sender, args) { args.get_menu().add_hidden(initiateSaveState); } </script></telerik:RadCodeBlock> <telerik:RadPersistenceManager runat="server" ID="RadPersistenceManager1"> <PersistenceSettings> <telerik:PersistenceSetting ControlID="RadGrid1" /> </PersistenceSettings></telerik:RadPersistenceManager> <telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" EnableHeaderContextMenu="true"> <ClientSettings> <ClientEvents OnHeaderMenuShowing="menuShowing" /> </ClientSettings></telerik:RadGrid><telerik:RadButton runat="server" ID="DummyButton1" Style="visibility: hidden;" OnClick="DummyButton1_Click"></telerik:RadButton>And the code-behind:
protected void Page_Init(object sender, EventArgs e){ RadPersistenceManager1.StorageProvider = new SessionStorageProvider();} protected void Page_PreRender(object sender, EventArgs e){ if (!Page.IsPostBack) { if (Session["test"] != null) { SessionStorageProvider.StorageProviderKey = "test"; RadPersistenceManager1.LoadState(); } }} protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e){ DataTable table = new DataTable(); int columnsCount = 20; int rowsCount = 30; for (int i = 0; i < columnsCount; i++) { table.Columns.Add("Column" + i, typeof(string)); } for (int i = 0; i < rowsCount; i++) { table.Rows.Add(); for (int z = 0; z < columnsCount; z++) { table.Rows[i][z] = "SomeValue" + i; } } (sender as RadGrid).DataSource = table;} protected void DummyButton1_Click(object sender, EventArgs e){ SessionStorageProvider.StorageProviderKey = "test"; RadPersistenceManager1.SaveState();} public class SessionStorageProvider : IStateStorageProvider{ private System.Web.SessionState.HttpSessionState session = HttpContext.Current.Session; static string storageKey; public static string StorageProviderKey { set { storageKey = value; } } public void SaveStateToStorage(string key, string serializedState) { session[storageKey] = serializedState; } public string LoadStateFromStorage(string key) { return session[storageKey].ToString(); }}Hope this helps.
Regards,
Konstantin Dikov
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
0
Bill O'Neil
Top achievements
Rank 1
answered on 16 Dec 2015, 01:24 PM
thank you for your time.
will this method store ALL RadGrid settings (so if the grid is on page 2 and sorted those will be saved w/ the column visibility?)
0
Hi Bill,
The approach from my example will store all settings in the control. If you need to remove some of the settings (or all of them) and include only particular one you could take a look at the following help article:
Best Regards,
Konstantin Dikov
Telerik
The approach from my example will store all settings in the control. If you need to remove some of the settings (or all of them) and include only particular one you could take a look at the following help article:
Best Regards,
Konstantin Dikov
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
