Click here to Skip to main content
13,297,878 members (46,620 online)
Click here to Skip to main content
Add your own
alternative version


39 bookmarked
Posted 8 Nov 2006

A "stateful" scrollable panel

, 8 Nov 2006
Rate this:
Please Sign up or sign in to vote.
A scrollable panel retaining its scroll position across postbacks.

After postback before restoring scroll position

Scroll position restored


Often, we wrap a GridView inside a panel with the "overflow:scroll" style set and expect the user to scroll and select a GridView item to work with. The problem is that whenever the page is posted back, the selected item is not visible because the panel scroll position has been reset.

At our latest project, we needed such a functionality, but could not find anything similar, so we decided to code it ourselves. The result is the "StatefulScrollPanel", a custom control that retains its scroll position across postbacks.


Basically, all we need is some basic knowledge of JavaScript and an elementary overriding of two of asp:Panel's own methods. We start with two hidden fields that accompany our control and whose purpose is to keep track of the scrollTop and scrollLeft properties of the panel (div). These, along with the method that keeps track of the control's scroll position, are rendered just before our control, so we override the Render(HtmlTextWriter) method. Since we do want the control to be displayed with no trouble at design time, we simply delegate to the parent if in design mode:

protected override void Render(HtmlTextWriter writer)
    if (DesignMode)

     * Hidden inputs to persist scroll position(s)
    writer.Write("<input type='hidden' name='" + 
                ScrollXInputId + "' id='" +
                ScrollXInputId + "' value='" + 
                ScrollXInputValue + "'/>");
    writer.Write("<input type='hidden' name='" + 
                 ScrollYInputId + "' id='" + 
                 ScrollYInputId + "' value='" + 
                 ScrollYInputValue + "'/>");
    //Trace method that populates the hidden inputs
    writer.Write("<script language="'Javascript'">function " + 
                 TraceMethod + "{" + GetElementAccessor(ScrollXInputId) + 
                 ".value = " + GetElementAccessor(ClientID) +  
                 ".scrollLeft;" + GetElementAccessor(ScrollYInputId) +  
                 ".value = " + GetElementAccessor(ClientID) + 
                 ".scrollTop;}" + "</script>");

    //Delegate core rendering to momma

The GetElementAccessor(String) method, and the Scroll[X|Y]InputId, Scroll[X|Y]InputValue, and TraceMethod properties are helpers used to reduce the code we have to write. Take a look at the control's code to see their definitions.

All we have to do now is to register the trace method with our control during the OnLoad(EventArgs) event and set the scroll position:

protected override void OnLoad(EventArgs e)
    //To enable scrolling in the first place
    base.Style.Add(HtmlTextWriterStyle.Overflow, "scroll");
    //Register our trace method
    base.Attributes.Add("onScroll", TraceMethod);            

    //On start up set scroll position(s) to the existing one
    Page.ClientScript.RegisterStartupScript(GetType(), AdjustScriptKey, 
        GetElementAccessor (ClientID) + ".scrollLeft = " + 
                ScrollXInputValue + ";" + 
            GetElementAccessor(ClientID) + ".scrollTop = " + 
                ScrollYInputValue + ";", 

That's it!

Using the code

Using the control is as simple as using the asp:Panel control itself. We drop it in our aspx pages, and set its Width and Height properties:

<cc1:StatefullScrollPanel ID="StatefullScrollPanel1" 

        runat="server" Width="250px" height="105px">
Panel elements go here           

Note that we do not have to explicitly set the overflow style since the control takes care of that. Also note that we can use as many controls we need on the same page since the produced code is unique for each control instance. We have tested the code with Firefox 2.0 and IE 6.0, and seems to be working fine.


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


About the Author

Greece Greece
Working in sunny Greece as a software engineer since 1998. Currently spending most of my time coding solutions for the telecommunications sector using Java, .Net, Oracle and PostgresSQL.

You may also be interested in...

Comments and Discussions

Generalstateful scrollable panel Pin
Larry Swarts26-May-07 6:38
memberLarry Swarts26-May-07 6:38 
GeneralDoesn't Seem to Work in AJAX UpdatePanel Pin
cavedog68-May-07 4:45
membercavedog68-May-07 4:45 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
s.oikonomopoulos8-May-07 23:28
members.oikonomopoulos8-May-07 23:28 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
zetarho11-May-07 0:48
memberzetarho11-May-07 0:48 
Im facing the same problem too,
where the suggested codes should be put by the way?
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
s.oikonomopoulos15-May-07 2:17
members.oikonomopoulos15-May-07 2:17 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
MiaF18-May-07 5:29
memberMiaF18-May-07 5:29 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
s.oikonomopoulos22-May-07 3:30
members.oikonomopoulos22-May-07 3:30 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
MiaF23-May-07 3:11
memberMiaF23-May-07 3:11 
GeneralRe: Doesn't Seem to Work in AJAX UpdatePanel Pin
southernpost28-Jun-07 7:18
membersouthernpost28-Jun-07 7:18 
QuestionThis really works! Pin
Hans Wijtvliet5-Apr-07 5:32
memberHans Wijtvliet5-Apr-07 5:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.171207.1 | Last Updated 8 Nov 2006
Article Copyright 2006 by s.oikonomopoulos
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid