Click here to Skip to main content
15,886,806 members
Articles / Web Development / ASP.NET
Article

Reset the page scroll position after a PostBack

Rate me:
Please Sign up or sign in to vote.
4.18/5 (10 votes)
31 Aug 2003 251.2K   1.5K   60   42
Reset the page scroll position after a PostBack using a custom class derived from HtmlInputHidden

Introduction

This code cancel the move of the scrollbar after a Postback. It is a simple Control based on HtmlInputHidden which saves, before the postback, the position of the scrollbar and moves it afterwards back to the old position. The variable is saved in the viewstate. This code uses JavaScript to get the position of the scrollbar and move it.

Code

C#
 using System;
 using System.Web.UI;

 namespace AnnulMvtPostBack
 {
  
  public class GetPositionPostBack: 
    System.Web.UI.HtmlControls.HtmlInputHidden, 
    IPostBackDataHandler
  {
    //The position is saving in the viewstate.
    public int VPos
    {
      get 
      {
        if(ViewState["VPos"]==null)
        {
          ViewState["VPos"] = 0;
        }
        return (int)ViewState["VPos"];
      }
      set { ViewState["VPos"] = value; }
    }

    public int HPos
    {
      get
      {
        if(ViewState["HPos"]==null)
        {
          ViewState["HPos"] = 0;
        }
        return (int)ViewState["HPos"];
      }
      set { ViewState["HPos"] = value; }
    }
    
    //Here the value of the HiddenControl is catching 
    //before the PostBack
    public bool LoadPostData(String postDataKey, 
      System.Collections.Specialized.NameValueCollection values) 
    {
      bool _returnV;
      bool _returnH;
        
      string Val = values[this.UniqueID].Trim();
      char Eperluette = Char.Parse("&");
      string[] _Val = Val.Split(Eperluette);
      if(_Val.Length>1)
      {
        if(!HPos.ToString().Equals(_Val[0])  && _Val[0].Trim()!=null )
        {
          HPos= Int32.Parse(_Val[0]);
          _returnH=true;  
        }
        else _returnH=false;

        if(!VPos.ToString().Equals(_Val[1])  && _Val[1].Trim()!=null )
        {
          VPos= Int32.Parse(_Val[1]);
          _returnV=true;  
        }
        else _returnV=false;  
      }
      else
      {
        HPos = 0;
        VPos=0;
        return false; //return true to execute RaisePostDataChangedEvent();
      }

      //_______return_________

      if(_returnV || _returnH) return false; 
       //return true to execute RaisePostDataChangedEvent();
      else return false;    
    }
    
    //This function is here just to understand the LoadPostData 
    //with the RaisePostDataChangedEvent() 
    public void RaisePostDataChangedEvent() 
    {
      // Part of the IPostBackDataHandler contract.  Invoked 
      // if we ever returned true from the
      // LoadPostData method (indicates that we want a change 
      // notification raised).  Since we
      // always return false, this method is just a no-op.
      
    }    

    //The control is rendered with a UniqueId and Javascript Code 
    //is use to get the position of the scrollbar
    protected override void OnPreRender(EventArgs e) 
    {        
      string _start = "<script language="'Javascript'">onscroll = function(){";
      _start += "document.getElementById('" + this.UniqueID + 
        "').value = document.body.scrollLeft+'&'+document.body.scrollTop;";
      _start += "}</script>";
      if(!Page.IsClientScriptBlockRegistered("start"))
      {
        Page.RegisterClientScriptBlock("start",_start);
      }
      //_______________Move the scrollbar____________________________________
      string _goScroll = "<script language="'javascript'">scrollTo("
        + this.HPos + ","+this.VPos+");</script>";
      if(!Page.IsStartupScriptRegistered("goScroll"))
      {
        Page.RegisterStartupScript("goScroll",_goScroll);
      }
    }    
  }
}

I just want to say that I have stolen this idea from another one on the Web (I don't remember who :( ) but I wasn't able to use it so I made my own code.

Mini Tip

  • Don't forget to load it like a control.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
France France
Young developer C#, Javascript, and database but just for fun...

Comments and Discussions

 
GeneralRe: Original Pin
WebGourou10-Sep-03 0:39
WebGourou10-Sep-03 0:39 
GeneralRe: Original Pin
BillBelliveau10-Sep-03 8:21
BillBelliveau10-Sep-03 8:21 
GeneralRe: Original Pin
Member 21736427-Nov-03 22:46
Member 21736427-Nov-03 22:46 
GeneralRe: Original Pin
WebGourou28-Nov-03 22:13
WebGourou28-Nov-03 22:13 
GeneralRe: Original Pin
Member 21736430-Nov-03 21:43
Member 21736430-Nov-03 21:43 
GeneralRe: Original Pin
Anonymous23-Jan-04 4:18
Anonymous23-Jan-04 4:18 
GeneralRe: Original Pin
Anonymous23-Jan-04 4:19
Anonymous23-Jan-04 4:19 
GeneralAnother cool script that works wonders : Pin
Cypher17-Feb-04 3:37
Cypher17-Feb-04 3:37 
GeneralRe: Original Pin
joshi_vipul23-Aug-05 0:59
joshi_vipul23-Aug-05 0:59 
GeneralRe: Original Pin
min.dom9-Sep-03 15:21
min.dom9-Sep-03 15:21 
GeneralRe: Original Pin
WebGourou10-Sep-03 0:40
WebGourou10-Sep-03 0:40 
GeneralRe: Original Pin
David Bergeron19-Jan-04 8:49
David Bergeron19-Jan-04 8:49 
GeneralRe: So~ cool~!!!! Pin
z14318-Feb-05 4:42
z14318-Feb-05 4:42 
GeneralRe: Original Pin
Anonymous12-Sep-03 10:55
Anonymous12-Sep-03 10:55 
GeneralRe: Original Pin
WebGourou14-Sep-03 9:38
WebGourou14-Sep-03 9:38 
GeneralRe: Original Pin
Anonymous15-Sep-03 22:10
Anonymous15-Sep-03 22:10 
GeneralRe: Original Pin
WebGourou16-Sep-03 3:00
WebGourou16-Sep-03 3:00 

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.