2

我有一个问题,我有一个 UpdatePanel,它使用计时器触发以更新具有新点的 ASP 图(基本上是http://www.4guysfromrolla.com/articles/121609-1.aspx下“创建真实时间表”)。我遇到了一个问题,每当计时器滴答作响时,整个页面都会滚动到顶部。计时器滴答时如何保持页面中的滚动位置?我已经尝试了http://www.4guysfromrolla.com/articles/111704-1.aspx上的说明和其他几个类似的 JavaScript 解决方案,但是只要计时器滴答作响,x 和 y 变量就会消失。

代码:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication4._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"></asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:ScriptManager ID="scmManager" runat="server"></asp:ScriptManager>
    <asp:UpdatePanel ID="updRealtimeChart" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
            <asp:Chart ID="chtRandomData" ...></asp:Chart><br />
            <asp:Repeater ID="valueRepeater"...></asp:Repeater>
            <asp:Label ID="errorLabel" Font-Bold="true" Font-Size="Larger" ForeColor="Firebrick" BackColor="Khaki" runat="server"></asp:Label>
            <asp:Timer ID="tmrRefreshChart" runat="server" Interval="300"></asp:Timer>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="periodUpdate" />
        </Triggers>
    </asp:UpdatePanel>
    ...etc rest of the page...

编辑:在后面的代码中,我试过这个来检查发生了什么:

public partial class _Default : System.Web.UI.Page
{
    public int count = 0;
    protected void Page_Init(object sender, EventArgs e)
    {
        Page.MaintainScrollPositionOnPostBack = true;
        count++;
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        errorLabel.Text += count;
        ... }

当我运行它时,UpdatePanel 不断在 errorLabel 中添加一个“1”,表示 Page_Load 和 Page_Init 函数只发生一次,但更新面板仍在移动滚动位置。

4

4 回答 4

5

您可以在 javascript 中使用 document.body.scrollTop 来存储滚动位置,然后再将其分配回去。我用过它,它对我有用。

也试试

Page.MaintainScrollPositionOnPostBack = true; 
于 2012-06-22T18:01:46.693 回答
2

我有类似的情况。在我的情况下,我只需要一个勾号来触发数据同步,所以我用来避免在更新面板进行更新时页面滚动到顶部的解决方案是在关闭 ScriptManager 标记之后插入这个 JavaScript :

<script type="text/javascript">
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            prm.add_beginRequest(beginRequest);
            function beginRequest() {
                prm._scrollPosition = null;
            }
</script>

我希望它对你有用。

于 2016-06-06T12:59:34.370 回答
1

这看起来像一个熟悉的 .NET 错误。在 Timer 控件上设置 ClientIDMode=Auto 应该可以修复它

于 2012-06-22T19:40:31.860 回答
1

Stack Overflow 中有几个答案。检查这个:

如何避免在 AutoPostBack 上滚动 UpdatePanel?

于 2012-06-22T19:18:36.073 回答