Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步回发后重置滚动位置-ASP.NET_C#_Asp.net_Gridview_Asp.net Ajax_Scroll Position - Fatal编程技术网

C# 异步回发后重置滚动位置-ASP.NET

C# 异步回发后重置滚动位置-ASP.NET,c#,asp.net,gridview,asp.net-ajax,scroll-position,C#,Asp.net,Gridview,Asp.net Ajax,Scroll Position,异步回发后,将滚动位置重置到页面顶部的最佳方法是什么 异步回发从ASP.NET GridView CommandField列启动,并在GridView onRow命令中调用ASP.NET update面板更新方法 我当前的应用程序是一个ASP.NET 3.5网站 编辑:我收到了来自每个人的优秀反馈,我在脚本标记中使用了PageRequestManager方法,但我的下一个问题是: 如何将其配置为仅在用户单击GridView控件中的ASP.NET CommandField时执行?我在页面上有其他按

异步回发后,将滚动位置重置到页面顶部的最佳方法是什么

异步回发从ASP.NET GridView CommandField列启动,并在GridView onRow命令中调用ASP.NET update面板更新方法

我当前的应用程序是一个ASP.NET 3.5网站

编辑:我收到了来自每个人的优秀反馈,我在脚本标记中使用了PageRequestManager方法,但我的下一个问题是:

如何将其配置为仅在用户单击GridView控件中的ASP.NET CommandField时执行?我在页面上有其他按钮执行异步回发,我不想滚动到页面顶部


编辑1:我开发了一个解决方案,不需要使用PageRequestManager。有关解决方案,请参阅我的后续答案。

是否已设置页面属性MaintainScrollPosition?不确定如果您执行异步回发,是否会有任何不同


编辑:您可以尝试的一件事是将焦点设置在页面顶部附近的特定项目上,这可能会有所帮助,而且是一项棘手的工作。

当您使用UpdatePanels时,您需要挂接到ASP.NET AJAX中

您需要向事件挂钩添加一个方法,该方法包括:

异步回发完成且控件已返回到浏览器后引发

所以你会有这样的想法:

<script type="text/javascript">
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(pageLoaded);

  function pageLoaded(sender, args) {
     window.scrollTo(0,0);
  }
</script>
异步回发的美妙之处在于,页面将保持滚动高度,而无需设置MaintainScrollPosition,因为不会发生“完整页面重新加载”的情况,在这种情况下,您实际上希望发生这种效果,因此需要手动创建它

编辑以答复更新的问题

好的,如果只需要在某些按钮按下时重置位置,则需要执行以下操作:

从挂接BeginRequest开始,也可以:

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
这是因为在args参数中,您可以访问:

args.get_postBackElement().id
这将告诉您启动整个事件的按钮的id-然后您可以在此处检查值,移动页面,或将其存储在变量中,并在最终请求中查询-了解竞态条件等,用户在原始更新完成之前单击另一个按钮


这应该会让你走运——关于这一点,在《你在使用asp.net AJAX吗?》上有很多例子?如果是这样的话,客户端库中有两个非常有用的事件
beginRequest和endRequest,部分/异步回发的问题之一,是常规页面不知道您在做什么。begin和endrequest事件将允许您在客户端维护滚动位置,您可以在js中设置一个var,该var设置为beginrequest上的滚动位置,然后在end request上,您可以重置所需的任何元素的滚动顶部。。我肯定我以前见过这样做,但找不到链接。如果我找到了一个例子,我会发帖子的。下面是我根据这个例子开发的解决方案

ASP.NET网络表单

<script language="javascript" type="text/javascript">
   function SetScrollEvent() {
      window.scrollTo(0,0);
   }
</script> 

<asp:GridView id="MyGridView" runat="server" OnRowDataBound="MyGridView_OnRowDataBound">
    <Columns>
        <asp:CommandField ButtonType="Link" ShowEditButton="true" />
    </Columns>
</asp:GridView>

我使用一个名为hScrollTop的隐藏输入,该输入是在asp.net表单发回之前设置的。然后,当页面加载时,它会根据隐藏输入的值设置scrollTop

在新页面上尝试此代码

<div style="height:500px"></div>

<form id="Form1" runat=server onsubmit="javascript:saveScrollTop();">
    <input type=submit value="Submit" runat=server>
    <input type="hidden" id="hScrollTop" runat=server>
</form>

<div style="height:1000px"></div>

<script language="javascript">
    function saveScrollTop() {
        document.getElementById("<%= hScrollTop.ClientID %>").value = document.body.scrollTop;
        return true;
    }

    window.onload = function() {
        document.body.scrollTop = document.getElementById("<%= hScrollTop.ClientID %>").value;
    }

</script>

函数saveScrollTop(){
document.getElementById(“”).value=document.body.scrollTop;
返回true;
}
window.onload=函数(){
document.body.scrollTop=document.getElementById(“”)值;
}

摘自本教程:

我们将MaintainScrollPositionOnPostback设置为true

然后,如果需要重置滚动位置,请调用以下方法:

Private Sub ResetScrollPosition()
If Not ClientScript.IsClientScriptBlockRegistered(Me.GetType(), "CreateResetScrollPosition") Then
   'Create the ResetScrollPosition() function
   ClientScript.RegisterClientScriptBlock(Me.GetType(), "CreateResetScrollPosition", _
                    "function ResetScrollPosition() {" & vbCrLf & _
                    " var scrollX = document.getElementById('__SCROLLPOSITIONX');" & vbCrLf & _
                    " var scrollY = document.getElementById('__SCROLLPOSITIONY');" & vbCrLf & _
                    " if (scrollX && scrollY) {" & vbCrLf & _
                    "    scrollX.value = 0;" & vbCrLf & _
                    "    scrollY.value = 0;" & vbCrLf & _
                    " }" & vbCrLf & _
                    "}", True)

   'Add the call to the ResetScrollPosition() function
   ClientScript.RegisterStartupScript(Me.GetType(), "CallResetScrollPosition", "ResetScrollPosition();", True)
End If
End Sub 

这是在AJAX中将滚动条位置重置为顶部的完美解决方案

客户端代码

function ResetScrollPosition()
{
    setTimeout("window.scrollTo(0,0)", 0);
}
服务器端代码

ScriptManager.RegisterStartupScript(Page, this.GetType(), "ScrollPage", "ResetScrollPosition();", true);
仅Windows.scrollTo(0,0)将不起作用。在这种情况下,Ajax将优先使用,因此您必须使用setTimeout函数;
将上面的内容放到你想告诉的函数上,转到页面顶部。例如,当页面无效时,将其保存在那里,它将添加临时javascript以将您拍摄到页面顶部。

我只想使用ASP.NET GridView的此特定事件返回页面顶部。我在同一页上有一堆其他按钮,我想保持滚动位置。是的,但是如果你只想在某些事件上发生这种情况,并且只在单击某个按钮的特定时间发生,该怎么办?
function ResetScrollPosition()
{
    setTimeout("window.scrollTo(0,0)", 0);
}
ScriptManager.RegisterStartupScript(Page, this.GetType(), "ScrollPage", "ResetScrollPosition();", true);