This is a migrated thread and some comments may be shown as answers.

gridsettingspersister with xmlserializer

1 Answer 38 Views
Grid
This is a migrated thread and some comments may be shown as answers.
byoung
Top achievements
Rank 1
byoung asked on 07 Dec 2012, 08:01 PM
I can not get the xmlserializer to work in the gridSettingsPersister.vb class. Once I move everything to use xmlserializer it blows up saying that the there is an error creating the xml document. The innerexception says.{"The type System.Collections.ArrayList may not be used in this context."}. Can anyone assist me on this one.  below is my code for the persister.

There error occurs here:"There was an error generating the XML document."

  Public Overloads Overrides Function ToString() As String
        Dim formatter As New XmlSerializer(Me.GetType())
        Dim writer As New StringWriter()
        formatter.Serialize(writer, Me) - ******** This is the error line 
        Return writer.ToString()
    End Function

Imports System
Imports System.Collections.Generic
Imports System.Web
Imports Telerik.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections
Imports System.Web.UI
Imports System.IO
Imports System.Xml.Serialization
 
 
''' <summary>
''' Imports and exports settings from a RadGrid instance.
''' </summary>
Public Class GridSettingsPersister
 
    ''' <summary>
    ''' Initializes an instance of GridSettingsPersister from a RadGrid instance
    ''' </summary>
    ''' <param name="grid">The RadGrid instance to import and exports settings</param>
    Public Sub New(ByVal grid As RadGrid)
 
        Me.New(grid, GridSettingsType.All)
    End Sub
 
    ''' <summary>
    ''' Initializes an instance of GridSettingsPersister from a RadGrid instance
    ''' and a collection GridSettingsType values
    ''' </summary>
    ''' <param name="grid">The RadGrid instance to import and exports settings</param>
    ''' <param name="persistedSettingFlags">
    ''' A collection of GridSettingType values specifying the type of grid settings
    ''' to import or export
    ''' </param>
    Public Sub New(ByVal grid As RadGrid, ByVal persistedSettingFlags As GridSettingsType)
        _grid = grid
        _persistedSettingTypes = persistedSettingFlags
        _settings = New GridSettingsCollection()
        _settings.ColumnSettings = New List(Of ColumnSettings)()
        _settings.AutoGeneratedColumnSettings = New List(Of ColumnSettings)()
    End Sub
 
    Private _grid As RadGrid
    Private _persistedSettingTypes As GridSettingsType
    Private _settings As GridSettingsCollection
 
    ''' <summary>
    ''' The underlyiong RadGrid instance to import or export settings from
    ''' </summary>
    Public ReadOnly Property Grid() As RadGrid
        Get
            Return _grid
        End Get
    End Property
 
    ''' <summary>
    ''' Gets or sets the GridSettingType flags that specify the grid settings to
    ''' export or import
    ''' </summary>
    Public Overridable Property PersistedSettingTypes() As GridSettingsType
        Get
            Return _persistedSettingTypes
        End Get
        Set(ByVal value As GridSettingsType)
            _persistedSettingTypes = value
        End Set
    End Property
 
    Protected Overridable Property Settings() As GridSettingsCollection
        Get
            Return _settings
        End Get
        Set(ByVal value As GridSettingsCollection)
            _settings = value
        End Set
    End Property
 
    ''' <summary>
    ''' Saves the current grid settings and returns the settings serilized to string
    ''' </summary>
    Public Overridable Function SaveSettings() As String
        Return GetSavedSettings().ToString()
 
        'save item to DB then return the data
 
    End Function
 
    ''' <summary>
    ''' Saves the current grid settings and retrieves the underlying
    ''' GridSettingsCollection instance that contains the grid settings
    ''' </summary>
    Public Overridable Function GetSavedSettings() As GridSettingsCollection
        If Grid Is Nothing Then
            Throw New NullReferenceException()
        End If
 
        If IsSettingSpecified(GridSettingsType.Paging) Then
            SavePagingSettings()
        End If
        If IsSettingSpecified(GridSettingsType.Grouping) Then
            SaveGroupByExpressions()
        End If
        If IsSettingSpecified(GridSettingsType.Sorting) Then
            SaveSortExpressions()
        End If
        If IsSettingSpecified(GridSettingsType.Filtering) Then
            SaveFilterExpression()
        End If
        If IsSettingSpecified(GridSettingsType.ColumnSettings) Then
            SaveColumnSettings()
        End If
 
        Return Settings
    End Function
 
    Protected Function IsSettingSpecified(ByVal settingType As GridSettingsType) As Boolean
        Return (PersistedSettingTypes And GridSettingsType.All) = GridSettingsType.All OrElse (PersistedSettingTypes And settingType) = settingType
    End Function
 
    Protected Overridable Sub SavePagingSettings()
        Settings.PageSize = Grid.MasterTableView.PageSize
    End Sub
 
    Protected Overridable Sub SaveGroupByExpressions()
        Settings.GroupByExpressionsStates = New Object(Grid.MasterTableView.GroupByExpressions.Count - 1) {}
        Dim i As Integer = 0
        While i < Settings.GroupByExpressionsStates.Length
            Settings.GroupByExpressionsStates(i) = (DirectCast(Grid.MasterTableView.GroupByExpressions(i), IStateManager)).SaveViewState()
            System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
        End While
    End Sub
 
    Protected Overridable Sub SaveSortExpressions()
        Settings.SortExpressionsState = (DirectCast(Grid.MasterTableView.SortExpressions, IStateManager)).SaveViewState()
    End Sub
 
    Protected Overridable Sub SaveFilterExpression()
        Settings.FilterExpression = Grid.MasterTableView.FilterExpression
    End Sub
 
    Protected Overridable Sub SaveColumnSettings()
        Settings.ColumnSettings.Clear()
        For Each column As GridColumn In Grid.MasterTableView.Columns
            Settings.ColumnSettings.Add(GetColumnSettings(column))
        Next
 
        Settings.AutoGeneratedColumnSettings.Clear()
        For Each column As GridColumn In Grid.MasterTableView.AutoGeneratedColumns
            Settings.AutoGeneratedColumnSettings.Add(GetColumnSettings(column))
        Next
    End Sub
 
    Private Function GetColumnSettings(ByVal column As GridColumn) As ColumnSettings
        Dim colSettings As New ColumnSettings()
        colSettings.UniqueName = column.UniqueName
        colSettings.Width = column.HeaderStyle.Width
        colSettings.Visible = column.Visible
        colSettings.Display = column.Display
        colSettings.OrderIndex = column.OrderIndex
        colSettings.CurrentFilterFunction = column.CurrentFilterFunction
        colSettings.CurrentFilterValue = column.CurrentFilterValue
 
        Return colSettings
    End Function
 
    Private Sub SetColumnSettings(ByRef column As GridColumn, ByVal setting As ColumnSettings)
        column.Display = setting.Display
        column.Visible = setting.Visible
        column.HeaderStyle.Width = setting.Width
        column.OrderIndex = setting.OrderIndex
        column.CurrentFilterFunction = setting.CurrentFilterFunction
        column.CurrentFilterValue = setting.CurrentFilterValue
    End Sub
 
    ''' <summary>
    ''' Loads grids settings from a serialized string
    ''' </summary>
    ''' <param name="value">The string that contains the serialized settings</param>
    Public Overridable Sub LoadSettings(ByVal value As String)
 
        'retrieve from database the serialized string of data and call load settings
 
        LoadSettings(GridSettingsCollection.LoadFromSerializedData(value))
    End Sub
 
    ''' <summary>
    ''' Loads grids settings from a byte array
    ''' </summary>
    ''' <param name="data">The byte array that contains the serialized grid settings</param>
    Public Overridable Sub LoadSettings(ByVal data As Byte())
        LoadSettings(GridSettingsCollection.LoadFromSerializedData(data))
    End Sub
 
    ''' <summary>
    ''' Loads grid settings from a GridSettingsCollection instance
    ''' </summary>
    ''' <param name="savedSettings">The GridSettingsCollection instance to load settings from</param>
    Public Overridable Sub LoadSettings(ByVal savedSettings As GridSettingsCollection)
        If Grid Is Nothing OrElse savedSettings Is Nothing Then
            Throw New NullReferenceException()
        End If
 
        Settings = savedSettings
 
        If IsSettingSpecified(GridSettingsType.Paging) Then
            LoadPagingSettings()
        End If
        If IsSettingSpecified(GridSettingsType.Grouping) Then
            LoadGroupByExpressions()
        End If
        If IsSettingSpecified(GridSettingsType.Sorting) Then
            LoadSortExpressions()
        End If
        If IsSettingSpecified(GridSettingsType.Filtering) Then
            LoadFilterExpression()
        End If
        If IsSettingSpecified(GridSettingsType.ColumnSettings) Then
            LoadColumnSettings()
        End If
    End Sub
 
    Protected Overridable Sub LoadPagingSettings()
        If Grid.MasterTableView.AllowPaging AndAlso Settings.PageSize > 0 Then
            Grid.MasterTableView.PageSize = Settings.PageSize
        End If
    End Sub
 
    Protected Overridable Sub LoadGroupByExpressions()
        If Settings.GroupByExpressionsStates Is Nothing Then
            Return
        End If
 
        Grid.MasterTableView.GroupByExpressions.Clear()
        For Each expressionState As Object In Settings.GroupByExpressionsStates
            Dim expression As New GridGroupByExpression()
            DirectCast(expression, IStateManager).LoadViewState(expressionState)
            Grid.MasterTableView.GroupByExpressions.Add(expression)
        Next
    End Sub
 
    Protected Overridable Sub LoadSortExpressions()
        If Settings.SortExpressionsState Is Nothing Then
            Return
        End If
 
        DirectCast(Grid.MasterTableView.SortExpressions, IStateManager).LoadViewState(Settings.SortExpressionsState)
    End Sub
 
    Protected Overridable Sub LoadFilterExpression()
        Grid.MasterTableView.FilterExpression = Settings.FilterExpression
    End Sub
 
    Protected Overridable Sub LoadColumnSettings()
        If Settings.AutoGeneratedColumnSettings.Count > 0 Then
            AddHandler Grid.ColumnCreated, New GridColumnCreatedEventHandler(AddressOf Grid_ColumnCreated)
        End If
 
        For Each colSetting As ColumnSettings In Settings.ColumnSettings
            Dim column As GridColumn = Grid.MasterTableView.GetColumnSafe(colSetting.UniqueName)
 
            If column IsNot Nothing Then
                SetColumnSettings(column, colSetting)
            End If
        Next
    End Sub
    Private Sub Grid_ColumnCreated(ByVal sender As Object, ByVal e As GridColumnCreatedEventArgs)
 
        Dim colSettings As ColumnSettings = Nothing
        For Each colSettings In Settings.AutoGeneratedColumnSettings
            If colSettings.UniqueName = e.Column.UniqueName Then
                colSettings = colSettings
                Exit For
            End If
        Next colSettings
        Dim column As GridColumn = e.Column
        If colSettings IsNot Nothing Then
            SetColumnSettings(column, colSettings)
        End If
 
    End Sub
 
 
End Class
 
''' <summary>
''' Enumerates the types of grid settings that can be persisted
''' </summary>
<Flags()> _
Public Enum GridSettingsType
    Paging = 1
    Sorting = 2
    Filtering = 4
    Grouping = 8
    ColumnSettings = 16
    All = 32
End Enum
 
''' <summary>
''' Represents a collection of grid settings
''' </summary>
<Serializable()> _
Public Class GridSettingsCollection
    Private _pageSize As Integer
    Private _groupByExpressionsStates As Object
    Private _sortExpressionsState As Object
    Private _filterExpression As String
    Private _columnSettings As List(Of ColumnSettings)
    Private _autoColumnSettings As List(Of ColumnSettings)
 
    Public Property PageSize() As Integer
        Get
            Return _pageSize
        End Get
        Set(ByVal value As Integer)
            _pageSize = value
        End Set
    End Property
    Public Property GroupByExpressionsStates() As Object()
        Get
            Return _groupByExpressionsStates
        End Get
        Set(ByVal value As Object())
            _groupByExpressionsStates = value
        End Set
    End Property
    Public Property SortExpressionsState() As Object
        Get
            Return _sortExpressionsState
        End Get
        Set(ByVal value As Object)
            _sortExpressionsState = value
        End Set
    End Property
    Public Property FilterExpression() As String
        Get
            Return _filterExpression
        End Get
        Set(ByVal value As String)
            _filterExpression = value
        End Set
    End Property
    Public Property ColumnSettings() As List(Of ColumnSettings)
        Get
            Return _columnSettings
        End Get
        Set(ByVal value As List(Of ColumnSettings))
            _columnSettings = value
        End Set
    End Property
    Public Property AutoGeneratedColumnSettings() As List(Of ColumnSettings)
        Get
            Return _autoColumnSettings
        End Get
        Set(ByVal value As List(Of ColumnSettings))
            _autoColumnSettings = value
        End Set
    End Property
 
    ''' <summary>
    ''' Returns the serialized object as string
    ''' </summary>
    Public Overloads Overrides Function ToString() As String
        Dim formatter As New XmlSerializer(Me.GetType())
        Dim writer As New StringWriter()
        formatter.Serialize(writer, Me)
        Return writer.ToString()
 
    End Function
 
    ''' <summary>
    ''' Returns the serialized object as byte array
    ''' </summary>
    Public Function ToArray() As Byte()
        Dim formatter As New XmlSerializer(Me.GetType())
        Using stream As New MemoryStream()
            formatter.Serialize(stream, Me)
            Return stream.ToArray()
        End Using
    End Function
 
    ''' <summary>
    ''' Gets the GridSettingsCollectionInstance from its serialized string data
    ''' </summary>
    ''' <param name="data">The object as serialized string data</param>
    Public Shared Function LoadFromSerializedData(ByVal data As String) As GridSettingsCollection
        Dim formatter As New LosFormatter()
        Return DirectCast(formatter.Deserialize(data), GridSettingsCollection)
    End Function
 
    ''' <summary>
    ''' Gets the GridSettingsCollectionInstance from its serialized byte array
    ''' </summary>
    ''' <param name="data">The object as serialized byte array</param>
    Public Shared Function LoadFromSerializedData(ByVal data As Byte()) As GridSettingsCollection
        Dim formatter As New XmlSerializer(GetType(GridSettingsCollection))
        Using stream As New MemoryStream(data)
            Return DirectCast(formatter.Deserialize(stream), GridSettingsCollection)
        End Using
    End Function
End Class
 
''' <summary>
''' Represents a collection of grid column settings
''' </summary>
<Serializable()> _
Public Class ColumnSettings
    Private _uniqueName As String
    Private _orderIndex As Integer
    Private _width As Unit
    Private _visible As Boolean
    Private _display As Boolean
    Private _currentFilterFunction As GridKnownFunction
    Private _currentFilterValue As String
 
    Public Property UniqueName() As String
        Get
            Return _uniqueName
        End Get
        Set(ByVal value As String)
            _uniqueName = value
        End Set
    End Property
    Public Property OrderIndex() As Integer
        Get
            Return _orderIndex
        End Get
        Set(ByVal value As Integer)
            _orderIndex = value
        End Set
    End Property
    Public Property Width() As Unit
        Get
            Return _width
        End Get
        Set(ByVal value As Unit)
            _width = value
        End Set
    End Property
    Public Property Visible() As Boolean
        Get
            Return _visible
        End Get
        Set(ByVal value As Boolean)
            _visible = value
        End Set
    End Property
    Public Property Display() As Boolean
        Get
            Return _display
        End Get
        Set(ByVal value As Boolean)
            _display = value
        End Set
    End Property
    Public Property CurrentFilterFunction() As GridKnownFunction
        Get
            Return _currentFilterFunction
        End Get
        Set(ByVal value As GridKnownFunction)
            _currentFilterFunction = value
        End Set
    End Property
    Public Property CurrentFilterValue() As String
        Get
            Return _currentFilterValue
        End Get
        Set(ByVal value As String)
            _currentFilterValue = value
        End Set
    End Property
 
End Class


Any help will be appreciated.
Thank You,
Brian

1 Answer, 1 is accepted

Sort by
0
Antonio Stoilkov
Telerik team
answered on 12 Dec 2012, 12:37 PM
Hi Brian,

I have answered your question in the other thread. You could decide where to continue our conversation if any additional questions arise. Please keep in my mind that we recommend posting individual questions only once because this improves response time and does avoid duplicate answers.

Regards,
Antonio Stoilkov
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
Tags
Grid
Asked by
byoung
Top achievements
Rank 1
Answers by
Antonio Stoilkov
Telerik team
Share this question
or