web-dev-qa-db-fra.com

Postback ASP.net - Faites défiler jusqu'à une position spécifique

J'ai une page ASP.net WebForms qui contient beaucoup de contenu en haut de l'écran. Il comporte un bouton de lien qui affichera de nouveau la page et affichera une autre section de la page. Lorsque la page est actualisée, j'aimerais définir le focus et faire défiler jusqu'à cette section de la page.

J'ai essayé de faire 

txtField.Focus()

dans mon code derrière et il va mettre le focus et essayer de faire défiler, mais ensuite défile vers le haut. Le focus est toujours sur ma zone de texte mais la position de l'écran est tout en haut. Le lien est en haut de l'écran, ce qui provoque la publication. Je veux faire défiler vers le bas de l'écran. Il fait ceci brièvement puis fait défiler vers le haut.

J'ai essayé de mettre

Page.MaintainScrollPositionOnPostback = false;

mais cela ne semble pas aider non plus.

Est-il possible de le forcer à accéder à une position spécifique?

22
Dismissile

Page.MaintainScrollPositionOnPostBack = true; devrait vous ramener à la même position à l'écran, mais vous pouvez utiliser AJAX ou SetFocus() pour vous concentrer sur un contrôle spécifique après la publication:

http://msdn.Microsoft.com/en-us/library/ms178232.aspx

29
Theomax

Vous pouvez utiliser le code ci-dessous si vous avez une ancre pour l'emplacement:

ClientScript.RegisterStartupScript(this.GetType(), "hash", "location.hash = '#MOVEHERE';", true);
28
dvdmn

Dans votre cas, je vous suggère de conserver la valeur par défaut de Page.MaintainScrollPositionOnPostBack et d'utiliser la fonction de défilement javascript pure.

function scrollToDiv()
{
    document.getElementById('yourDiv').scrollIntoView();
}

Et appelez-le au démarrage de la page avec un peu de retard de 1 ms (à nouveau javascript pur)

setTimeout(scrollToDiv, 1);

Et enfin, appelez-le à partir du code C # situé derrière, avec RegisterStartupScript (js exécuté une fois que toute la page a été chargée):

ScriptManager.RegisterStartupScript(Page, typeof(Page), "ScrollToADiv", "setTimeout(scrollToDiv, 1);", true);

Comme cela, il contournera tout défilement automatique des asp

7

essaye ça

protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack) {
            string targetId = Page.Request.Params.Get("__EVENTTARGET");
            Page.ClientScript.RegisterStartupScript(this.GetType(), "focusthis", "document.getElementById('" + targetId + "').focus()", true);

        }
    }
0
Rana

Cela défile automatiquement vers le Div souhaité dans asp.net Control C’est Functioncall it from Where You Want Et aussi Télécharger le fichier de script Java

OnClientClick = "return scrollGrid ()"

function scrollGrid1 () { $ ('html, body'). animate ( { scrollTop: $ ('# Div1'). offset (). top }, 'slow' ) }

0
Suraj

J'ai 

<asp:MultiView ID="mvAriza" runat="server">
      <asp:View ID="View14" runat="server"> 
         ............ .......
      </asp:View>
</asp:MultiView>

sur la page * .aspx. Et sur la page * .aspx.cs sur un clic de bouton.

Page.SetFocus(mvAriza.ClientID);

Cela fonctionne très bien.

0
Hysen

Page.MaintainScrollPositionOnPostback = true semble bien fonctionner.

0
Mike S.

J'ai essayé Matthieu Charbonnier répond , mais ça n'a pas fonctionné à moins que j'ai ajouté

" window.scrollTo = function () { };" 

comme suggéré dans http://gnidesign.blogspot.com.au/2011/06/how-to-maintain-page-scroll-on-postback.html

J'ai créé une méthode d'assistance fonctionnant sous Chrome, FireFox et IE

public static void ScrollToControl( Page page, string clientId, bool alignToTop)
 {
     //NOTE: if there are more than one call on the page, first one will take preference
     //If we want that last will take  preference, change key from MethodBase.GetCurrentMethod().Name to anchorName
     //recommended in http://gnidesign.blogspot.com.au/2011/06/how-to-maintain-page-scroll-on-postback.html              
     String script = " window.scrollTo = function () { };" + Environment.NewLine;
     script += String.Format("document.getElementById('{0}').scrollIntoView({1});" , clientId, alignToTop.JSToString());
     page.ClientScript.RegisterStartupScript(TypeForClientScript(), MethodBase.GetCurrentMethod().Name, script, true );
     //return script;
 }
 public static string JSToString(this bool bValue)
 {
     return bValue.ToString().ToLower();
 }

Utilisez getElementById ('{0}'). ScrollIntoView est plus simple que location.hash, car il n'est pas nécessaire d'ajouter un élément d'ancrage supplémentaire.

Le paramètre alignToTop est très pratique pour spécifier si vous souhaitez afficher le contrôle en haut ou en bas de l'écran.

0
Michael Freidgeim