Following is a small application based on the WebMail example that demonstrates a way to persist runtime settings of Telerik RadGrid in a single text-based format. The format is almost identical to ViewState format ASP.NET Page use, so it is possible to persist the settings on any medium - session, application variables, database, etc. For your convenience, the functionality is isolated in a single class called GridSettingsPersister. It is designed to save, load into Telerik RadGrid the following runtime settings:
- Group-by expressions
- Sort expressions
- Columns order and width
- Filter expression
You can modify the settings to fit your case:
| C# |
Copy Code |
|
using System; using System.Collections; using System.IO; using System.Web.UI; using System.Web.UI.WebControls; using Telerik.WebControls;
namespace WebApplication1 { public class GridSettingsPersister { private RadGrid gridInstance;
public GridSettingsPersister( RadGrid gridInstance ) { this.gridInstance = gridInstance; } //this method should be called on Render public string SaveSettings() { object[] gridSettings = new object[4];
//Save groupBy GridGroupByExpressionCollection groupByExpressions = gridInstance.MasterTableView.GroupByExpressions; object[] groupExpressions = new object[groupByExpressions.Count];
int count = 0; foreach( GridGroupByExpression expression in groupByExpressions ) { groupExpressions[count] = ((IStateManager)expression).SaveViewState(); count++; }
gridSettings[0] = groupExpressions;
//Save sort expressions gridSettings[1] = ((IStateManager)gridInstance.MasterTableView.SortExpressions).SaveViewState();
//Save columns order int columnsLength = gridInstance.MasterTableView.Columns.Count + gridInstance.MasterTableView.AutoGeneratedColumns.Length;
Pair [] columnOrder = new Pair[ columnsLength ];
ArrayList allColumns = new ArrayList( columnsLength );
allColumns.AddRange(gridInstance.MasterTableView.Columns ); allColumns.AddRange(gridInstance.MasterTableView.AutoGeneratedColumns);
int i = 0; foreach( GridColumn column in allColumns ) { Pair p = new Pair(); p.First = column.OrderIndex; p.Second = column.HeaderStyle.Width;
columnOrder[i] = p;
i++; }
gridSettings[2] = columnOrder;
//Save filter expression gridSettings[3] = (object)gridInstance.MasterTableView.FilterExpression;
LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter(); formatter.Serialize( writer, gridSettings );
return writer.ToString();
}
//this method should be called on PageInit public void LoadSettings( string settings ) { LosFormatter formatter = new LosFormatter(); StringReader reader = new StringReader( settings );
object[] gridSettings = (object[])formatter.Deserialize( reader );
//Load groupBy GridGroupByExpressionCollection groupByExpressions = this.gridInstance.MasterTableView.GroupByExpressions; groupByExpressions.Clear();
object[] groupExpressionsState = (object[])gridSettings[0];
int count = 0; foreach( object obj in groupExpressionsState ) { GridGroupByExpression expression = new GridGroupByExpression(); ((IStateManager)expression).LoadViewState( obj ); groupByExpressions.Add( expression ); count++; }
//Load sort expressions this.gridInstance.MasterTableView.SortExpressions.Clear(); ((IStateManager)this.gridInstance.MasterTableView.SortExpressions).LoadViewState( gridSettings[1] );
//Load columns order int columnsLength = this.gridInstance.MasterTableView.Columns.Count + this.gridInstance.MasterTableView.AutoGeneratedColumns.Length;
Pair [] columnOrder = (Pair[])gridSettings[2];
if ( columnsLength == columnOrder.Length) { ArrayList allColumns = new ArrayList( columnsLength );
allColumns.AddRange(this.gridInstance.MasterTableView.Columns ); allColumns.AddRange(this.gridInstance.MasterTableView.AutoGeneratedColumns);
int i = 0; foreach( GridColumn column in allColumns ) { column.OrderIndex = (int)columnOrder[i].First; column.HeaderStyle.Width = (Unit)columnOrder[i].Second;
i++; } } //Load filter expression this.gridInstance.MasterTableView.FilterExpression = (string)gridSettings[3];
} } |
| VB.NET |
Copy Code |
|
Namespace WebApplication1 Imports System Imports System.Collections Imports System.IO Imports System.Web.UI Imports System.Web.UI.WebControls Imports Telerik.WebControls
Public Class GridSettingsPersister
Private gridInstance As RadGrid
Public Sub New(ByVal gridInstance As RadGrid) MyBase. New Me.gridInstance = gridInstance End Sub
Public Function SaveSettings() As String Dim gridSettings() As Object = New Object((4) - 1) {} Dim groupByExpressions As GridGroupByExpressionCollection = gridInstance.MasterTableView.GroupByExpressions Dim groupExpressions() As Object = New Object((groupByExpressions.Count) - 1) {} Dim count As Integer = 0 For Each expression As GridGroupByExpression In groupByExpressions groupExpressions(count) = CType(expression,IStateManager).SaveViewState count = (count + 1) Next gridSettings(0) = groupExpressions gridSettings(1) = CType(gridInstance.MasterTableView.SortExpressions,IStateManager).SaveViewState Dim columnsLength As Integer = (gridInstance.MasterTableView.Columns.Count + gridInstance.MasterTableView.AutoGeneratedColumns.Length) Dim columnOrder() As Pair = New Pair(columnsLength - 1){}
Dim allColumns As ArrayList = New ArrayList(columnsLength) allColumns.AddRange(gridInstance.MasterTableView.Columns) allColumns.AddRange(gridInstance.MasterTableView.AutoGeneratedColumns) Dim i As Integer = 0 For Each column As GridColumn In allColumns Dim p As Pair = New Pair p.First = column.OrderIndex p.Second = column.HeaderStyle.Width columnOrder(i) = p i = (i + 1) Next gridSettings(2) = columnOrder gridSettings(3) = CType(gridInstance.MasterTableView.FilterExpression, Object);
Dim formatter As LosFormatter = New LosFormatter Dim writer As StringWriter = New StringWriter formatter.Serialize(writer, gridSettings) Return writer.ToString End Function
Public Sub LoadSettings(ByVal settings As String) Dim formatter As LosFormatter = New LosFormatter Dim reader As StringReader = New StringReader(settings) Dim gridSettings() As Object = CType(formatter.Deserialize(reader),Object()) Dim groupByExpressions As GridGroupByExpressionCollection = Me.gridInstance.MasterTableView.GroupByExpressions groupByExpressions.Clear Dim groupExpressionsState() As Object = CType(gridSettings(0),Object()) Dim count As Integer = 0 For Each obj As Object In groupExpressionsState Dim expression As GridGroupByExpression = New GridGroupByExpression CType(expression,IStateManager).LoadViewState(obj) groupByExpressions.Add(expression) count = (count + 1) Next Me.gridInstance.MasterTableView.SortExpressions.Clear CType( Me.gridInstance.MasterTableView.SortExpressions,IStateManager).LoadViewState(gridSettings(1)) Dim columnsLength As Integer = (Me.gridInstance.MasterTableView.Columns.Count + Me.gridInstance.MasterTableView.AutoGeneratedColumns.Length) Dim columnOrder() As Pair = CType(gridSettings(2),Pair()) If (columnsLength = columnOrder.Length) Then Dim allColumns As ArrayList = New ArrayList(columnsLength) allColumns.AddRange( Me.gridInstance.MasterTableView.Columns) allColumns.AddRange( Me.gridInstance.MasterTableView.AutoGeneratedColumns) Dim i As Integer = 0 For Each column As GridColumn In allColumns column.OrderIndex = CType(columnOrder(i).First,Integer) column.HeaderStyle.Width = CType(columnOrder(i).Second,Unit) i = (i + 1) Next End If Me.gridInstance.MasterTableView.FilterExpression = CType(gridSettings(3), String) End Sub End Class End Namespace |
You can extend the logic and store the user preferences via Profile object (part of ASP.NET 2.0). Thus the settings will be preserved not only for the current user session but for subsequent sessions as well. More details are available in this code library thread.