ASP.NET GridView点击RowCommand后页面回顶的解决问询
解决ASP.NET GridView回发后滚动位置丢失问题
试过MaintainScrollPositionOnPostback="true"没用?试试下面这几个方案:
1. 先确认基础配置有没有问题
- 检查页面的
Page指令里是不是真的加对了位置:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="YourPage.aspx.cs" Inherits="YourNamespace.YourPage" MaintainScrollPositionOnPostback="true" %>
- 要是全局配置的话,看看web.config的pages节点:
<pages maintainScrollPositionOnPostBack="true"> <!-- 其他配置项 --> </pages>
注意:局部页面设置会覆盖全局,别搞反了。
2. 用JS手动记录滚动位置(最靠谱的方案)
服务器端的设置经常因为各种冲突失效,直接用JS硬控更稳:
第一步:加脚本记录位置
在页面的<head>或者<body>末尾插这段脚本:
<script type="text/javascript"> // 回发前把滚动位置存到隐藏域 window.onbeforeunload = function () { var scrollY = window.pageYOffset || document.documentElement.scrollTop; document.getElementById('hdnScrollPosition').value = scrollY; }; // 页面加载完恢复位置 window.onload = function () { var scrollY = document.getElementById('hdnScrollPosition').value; if (scrollY) { window.scrollTo(0, parseInt(scrollY)); } }; </script>
第二步:加个隐藏域存数据
在页面的<form>标签里加:
<asp:HiddenField ID="hdnScrollPosition" runat="server" />
第三步:给GridView按钮加客户端事件(可选)
如果是TemplateField里的按钮,直接加OnClientClick触发记录:
<asp:TemplateField> <ItemTemplate> <asp:Button ID="btnAction" runat="server" Text="操作" OnClick="btnAction_Click" OnClientClick="saveScrollPosition();" /> </ItemTemplate> </asp:TemplateField>
然后补充个小函数:
function saveScrollPosition() { var scrollY = window.pageYOffset || document.documentElement.scrollTop; document.getElementById('hdnScrollPosition').value = scrollY; }
3. 精准定位到点击的GridView行
要是想直接回到点击的那一行,而不是页面的滚动位置,可以这么搞:
后台C#代码
在按钮点击事件里记录行的ClientID:
protected void btnAction_Click(object sender, EventArgs e) { Button btn = (Button)sender; GridViewRow row = (GridViewRow)btn.NamingContainer; // 把行的ID存到隐藏域 hdnTargetRowID.Value = row.ClientID; // 这里写你的业务逻辑 }
客户端脚本修改
把之前的恢复脚本换成这个:
window.onload = function () { var targetRowID = document.getElementById('hdnTargetRowID').value; if (targetRowID) { var row = document.getElementById(targetRowID); if (row) { row.scrollIntoView({ behavior: 'smooth', block: 'center' }); } } };
别忘了加对应的隐藏域:
<asp:HiddenField ID="hdnTargetRowID" runat="server" />
4. 有UpdatePanel的情况要特殊处理
如果页面用了UpdatePanel,服务器端的滚动设置基本没用,得在UpdatePanel的事件里处理:
<script type="text/javascript"> var prm = Sys.WebForms.PageRequestManager.getInstance(); // 开始请求前记录位置 prm.add_beginRequest(function () { var scrollY = window.pageYOffset || document.documentElement.scrollTop; document.getElementById('hdnScrollPosition').value = scrollY; }); // 请求结束后恢复位置 prm.add_endRequest(function () { var scrollY = document.getElementById('hdnScrollPosition').value; if (scrollY) { window.scrollTo(0, parseInt(scrollY)); } }); </script>
注意:页面得有ScriptManager控件才能用这个。
内容的提问来源于stack exchange,提问作者Aruna Prabhath
相关产品推荐
相关产品推荐

