ho una pagina server asp.net di esempio. Anche se usi un sistema diverso, forse puoi trovare uno spunto.
Il principio è questo:
dentro il form si mettono due hidden che sono valorizzati con la posizione della pagina.
Quando viene fatta l'aggiornamento della pagina, nell'evento load, viene ristabilita la posizione x e y originali.
Il codice è questo: ho messo commenti affinchè sia comprensibile pure a chi non usa asp.net, comunque siamo qui:

codice:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="scroll_griglia_senza_webcontrol.aspx.vb" Inherits="CorsoApogeo_wrox_comandi_ed_associazione_di_dati_datagrid_scroll_griglia_senza_webcontrol" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Pagina senza titolo</title>
    <link href="../../../../stili/Styles.css" rel="stylesheet" type="text/css" />
		<script id="clientEventHandlersJS" type="text/javascript" >
<!--

function window_onload() 
{
	if(self.RestoreScrollPosition) RestoreScrollPosition();
	if(self.SaveScrollPositions) SaveScrollPositions();
	
	
}

function RestoreScrollPosition() 
{ 

	scrollTo(document.forms[0].StaticPostBackScrollHorizontalPosition.value, document.forms[0].StaticPostBackScrollVerticalPosition.value); 
	
} 

function SaveScrollPositions() 
{ 
	document.forms[0].StaticPostBackScrollVerticalPosition.value = GetScrollY();
	document.forms[0].StaticPostBackScrollHorizontalPosition.value = GetScrollX();
	setTimeout('SaveScrollPositions()', 10);
} 

function GetScrollY()
{
    if (document.documentElement && document.documentElement.scrollTop)
	    return document.documentElement.scrollTop;
    else if (document.body)
	    return document.body.scrollTop
    else
    {
	    return window.pageYOffset;

    }    
}


function GetScrollX()
{
    if (document.documentElement && document.documentElement.scrollLeft)
	    return document.documentElement.scrollLeft;
    else if (document.body)
	    return document.body.scrollLeft
    else
    {
	    return window.pageXOffset;

    }    
    
}


//-->
		</script>
	</head>
	<body onload="return window_onload()">
		<h3>Scroll di una griglia</h3>
		<form id="Form1" method="post" runat="server">
			
			<%-- questi due hidden conservano la posizione di scroll  
			    e vanno valorizzati nel server
			--%>
			<input type="hidden" id="StaticPostBackScrollVerticalPosition" value="0" runat="server" />
			<input type="hidden" id="StaticPostBackScrollHorizontalPosition" value="0" runat="server" />
			
			<%-- questa è una semplice tabella con molte righe --%>
			<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" EnableViewState="true" Width="1500px">
				<Columns>
					<asp:ButtonColumn ButtonType="PushButton" HeaderText="submit" Text="SUBMIT"></asp:ButtonColumn>
					<asp:BoundColumn DataField="id" HeaderText="ID"></asp:BoundColumn>
					<asp:BoundColumn DataField="nome_comune" HeaderText="COMUNE"></asp:BoundColumn>
					<asp:EditCommandColumn EditText="Modifica" HeaderText="Operazioni" UpdateText="Aggiorna" CancelText="Annulla"></asp:EditCommandColumn>
				</Columns>
			</asp:DataGrid>
		</form>
	</body>
</html>