RadGrid for ASP.NET

Saving grid settings on a per user basis Send comments on this topic.
How-to > Saving grid settings on a per user basis

Glossary Item Box

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

         'this method should be called on Render
         Public Function SaveSettings() As String
             Dim gridSettings() As Object = New Object((4) - 1) {}
             'Save groupBy
             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
             'Save sort expressions
            gridSettings(1) = CType(gridInstance.MasterTableView.SortExpressions,IStateManager).SaveViewState
             'Save columns order
             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
            'Save filter expression
             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

         'this method should be called on PageInit
         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())
             'Load groupBy
             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
             'Load sort expressions
             Me.gridInstance.MasterTableView.SortExpressions.Clear
            CType( Me.gridInstance.MasterTableView.SortExpressions,IStateManager).LoadViewState(gridSettings(1))
             'Load columns order
             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
             'Load filter expression
              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.