5,550,131 members and growing! (18,880 online)
Email Password   helpLost your password?
Web Development » ASP.NET » Howto     Intermediate License: The Code Project Open License (CPOL)

Generic State Collection

By Velio Ivanov

Generic implementation of IStateManager for ASP.NET state collections.
C# (C# 1.0, C# 2.0, C# 3.0, C#).NET, .NET 2.0, .NET 3.5, .NET 3.0, ASP.NET, Dev

Posted: 27 Jan 2008
Updated: 22 Mar 2008
Views: 3,542
Bookmarked: 6 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
4 votes for this Article.
Popularity: 1.66 Rating: 2.75 out of 5
2 votes, 50.0%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
1 vote, 25.0%
4
1 vote, 25.0%
5
Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article
Download StateCollection.zip - 925 B

Introduction

While building custom ASP.NET controls I often need to implement IStateManager for collections of objects in order to persist them in ViewState.
The common way was to create collection by inherit List<T> and implementing IStateManager.
In most of the cases the code was same, I just have to change the generic type of the list.
That's why it was a perfect candidate for generic implementation. Implementation which made

The Generic State Collection gave me the ability to use any kind of state collections without a line of additional code.

The Code

StateCollection inherits List<T> class and implements IStateManager. Please, note I'm requiring the generic type of StateCollection to be one that implements IStateManager by itself.

Here is the source code of StateCollection class:

/// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
public class StateCollection<T> : List<T>, IStateManager where T : IStateManager, new(){

#region Fields  /////////////////////////////////////////////////////////////////

bool _tracking;

#endregion

#region Properties  /////////////////////////////////////////////////////////////

/// <summary>
/// When implemented by a class, gets a value indicating whether a server control is tracking its view state changes.
/// </summary>
/// <value></value>
/// <returns>true if a server control is tracking its view state changes; otherwise, false.</returns>
public bool IsTrackingViewState {
    get { return _tracking; }
}
#endregion

#region Methods /////////////////////////////////////////////////////////////////

/// <summary>
/// Loads the state of the view.
/// </summary>
/// <param name="savedState">State of the saved.</param>
public void LoadViewState(object savedState) {

    object[] state = savedState as object[];
    if (state != null) {
        T item;
        bool exists;
        for (int i = 0; i < state.Length; i++) {
            item = (exists =( i < this.Count)) ? this[i] : new T();
            item.LoadViewState(state[i]);
            if (this.IsTrackingViewState)
                item.TrackViewState();
            if(!exists) Add(item);
        }
    }
}

/// <summary>
/// When implemented by a class, saves the changes to a server control's view state to an <see cref="T:System.Object"/>.
/// </summary>
/// <returns>
/// The <see cref="T:System.Object"/> that contains the view state changes.
/// </returns>
public object SaveViewState() {

    if (this.Count > 0) {
        int count = this.Count;
        object[] state = new object[count];
        for (int i = 0; i < count; i++) {
            state[i] = this[i].SaveViewState();
        }
        return state;
    }
    else
        return null;
}

/// <summary>
/// When implemented by a class, instructs the server control to track changes to its view state.
/// </summary>
public void TrackViewState() {
    _tracking = true;
}
#endregion
}

Points of Interest

As example of how to use StateCollection you can refer to GoogleMap Control source code.

History

  • 22.Mar.2008 - Initial release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Velio Ivanov



Occupation: Web Developer
Location: Bulgaria Bulgaria

Other popular ASP.NET articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
  (Refresh) 
Subject  Author Date 
-- There are no messages in this forum --

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 22 Mar 2008
Editor:
Copyright 2008 by Velio Ivanov
Everything else Copyright © CodeProject, 1999-2008
Web15 | Advertise on the Code Project