单击按钮或其他操作后保存页面位置(在浏览器中垂直滚动...)

时间:2010-02-26 06:39:30

标签: asp.net

点击按钮或其他一些操作(在PostBack之后)

后,我可以在浏览器中保存页面位置吗?

我需要在我的DBGrid中的Page Change事件上,就像在msdn.microsoft.com上一样 - 当我更改Tab C# - >例如,C ++不刷新整个页面,我仍然在浏览器中处于同一位置。

2 个答案:

答案 0 :(得分:3)

您可以通过在ASPX文件的page指令中指定MaintainScrollPositionOnPostback =“true”来完成此操作。

例如:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyPage.aspx.cs" Inherits="MySite.MyPage" MaintainScrollPositionOnPostback="true" %>

享受,

Koby

答案 1 :(得分:1)

回到我的1.1项目,我通过一个隐藏的文本框和一些JavaScript完成了这个。

首先,您需要跟踪页面上滚动条的位置。

document.body.onscroll = function(){
       document.getElementById('hiddentextboxid').value =                         
                  document.body.scrollLeft + '|' + document.body.scrollTop;
 }

其中hiddentextboxid是您放置在页面上的隐藏文本框的ClientID。

其次,您需要在再次显示页面时重置滚动位置。我这样做的第一步是发出一个javascript函数来重置位置:

        string sPosition = HttpContext.Current.Request.Form[hiddentextboxid];
        if (sPosition != null && sPosition != "")
        {
            string[] sPos = sPosition.Split("|".ToCharArray());
            StringBuilder strScript = new StringBuilder();
            strScript.Append("<script language='Javascript'>\r\n");
            strScript.Append("function ProcessScroll(){\r\n");
            strScript.Append("    window.scrollTo(" + sPos[0] + ", " + sPos[1] + ");\r\n");
            strScript.Append("}\r\n");
            strScript.Append("</script>");
            if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "Scroll"))
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Scroll", strScript.ToString());
        }

然后我有这段代码在适当的时候调用javascript函数:

            sScript.Append("<script language='javascript'>\r\n");
        sScript.Append("document.body.onload = function() {\r\n");

        if (Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "Scroll"))
        {
            sScript.Append("    ProcessScroll();\r\n");
            sScript.Append("}\r\n");
            sScript.Append("</script>");
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ProcessOnLoad", sScript.ToString());
        }

我相信有一些更新,更有效的方法可以做到这一点。但是,我在很长一段时间内都没有使用过这段代码,因为我现在通常会使用Ajax回发来避免这个问题。