2009-11-25 10 views
1

Je dois donc faire défiler vers le haut de la page après une publication asynchrone dans un panneau de mise à jour asp.net.Faire défiler vers le haut de la page après le post asynchrone

Le code j'était le suivant:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestEventHandler); 
function EndRequestEventHandler(sender, args) 
{ 
    scrollTo(0,0); 
} 

Cependant, je ne veux que cela soit exécuté lorsque je clique sur un certain bouton qui provoque la postback async.

Comment câbler cet événement dans mon code derrière un événement de bouton?

Toute aide serait appréciée, merci!

Répondre

1

Essayez ceci:

protected void myButon_Click(object sender, EventArgs e) 
{ 
ScriptManager.RegisterStartupScript(this, typeof(MyControl), "someText", "alert('!');", true); 
} 
+1

J'ai essayé ceci sans succès. Quelque chose fait défiler la page vers le panneau que je viens d'activer. – Farinha

4

Ma quête d'une solution est enfin terminée. Cette question faisait partie de l'aide, et le reste, j'ai trouvé here.

Had pour remplacer le comportement de ASP.NET Ajax de mémoriser la position de défilement:

<script type="text/javascript"> 

var manager = Sys.WebForms.PageRequestManager.getInstance(); 

manager.add_beginRequest(beginRequest); 
function beginRequest() 
{ 
    manager._scrollPosition = null; 
} 
</script> 

Et puis utilisez le bit de code dans la réponse ici, sur la codebehind de la page que je voulais faire défiler vers le haut :

ScriptManager.RegisterStartupScript(this, typeof(MyControl), "someText", "window.scrollTo(0, 0)", true); 
3

J'utilisé réponse Farinha (thanks!) et il a changé un peu pour que je puisse simplement appeler la méthode tout endroit que je voulais faire défiler vers le haut, mais maintenir la position de défilement autrement.

public static void ScrollToTop(int intPosY = 0) 
    { 
     string strScript = @"var manager = Sys.WebForms.PageRequestManager.getInstance(); 
      manager.add_beginRequest(beginRequest); 
      function beginRequest() 
      { 
       manager._scrollPosition = null; 
      } 
      window.scroll(0," + intPosY.ToString() + ");"; 

     Page pagCurrent = GetCurrentPage(); 
     ScriptManager.RegisterStartupScript(pagCurrent, pagCurrent.GetType(), string.Empty, strScript, true); 

     return; 
    } 

public static Page GetCurrentPage() 
{ 
    return (HttpContext.Current.Handler as Page); 
} 
1

Améliorer les réponses de @Farinha et @Bradford Scott, le code peut être simplifié à ceci:

var script = 
    "Sys.WebForms.PageRequestManager.getInstance()._scrollPosition = null; " + 
    "window.scrollTo(0, 0);" 

ScriptManager.RegisterStartupScript(this, GetType(), "key", script, true); 

Je suis en fait même pas sûr de savoir pourquoi leurs scripts fonctionnent car ils ajoutent la remise à zéro du Sys.WebForms.PageRequestManager_scrollPosition en tant que gestionnaire add_beginRequest, et ici nous revenons effectivement de la demande.

De toute façon, réinitialiser le _scrollPosition juste avant de faire votre propre appel scrollTo() fonctionne définitivement.

Questions connexes