4

我有一个 PageSize = 20(20 行)的 GridView,但它只能显示 10 行而没有出现垂直滚动条。

我的问题是,当回发发生时,即使我选择了不同的行,它也会跳到网格的第一行。我想滚动到选定的行。我怎样才能做到这一点?

4

3 回答 3

1

添加MaintainScrollPositionOnPostback 您的页面指令。

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" MaintainScrollPositionOnPostback ="true"%> 

另一种方法是使用包装 GridView 的 DIV 的 scrollTop 方法:

private void ScrollGrid()
{
    int intScrollTo = this.gridView.SelectedIndex * (int)this.gridView.RowStyle.Height.Value;
    string strScript = string.Empty;
    strScript += "var gridView = document.getElementById('" + this.gridView.ClientID + "');\n";
    strScript += "if (gridView != null && gridView.parentElement != null && gridView.parentElement.parentElement != null)\n";
    strScript += "  gridView.parentElement.parentElement.scrollTop = " + intScrollTo + ";\n";
    ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "ScrollGrid", strScript, true);
}

编辑: 这不起作用有几个原因:

1) 如果 gridView 在 NamingContainer 控件内,比如 Panel,因为客户端的 Id 不会是ClientId. 您需要改用UniqueIdof teh 控件。

2)你不能相信行高来计算滚动位置。如果任何列中的文本换行超过一行,或者任何行包含高于样式的内容,则该行的大小将不同

3)不同的浏览器可以有不同的行为。你最好使用 jQueryscrollTop()scroll()函数。要使用它们,您必须scrollTop在客户端使用并设置HiddenControl可以在服务器端读取的值以重置位置。在客户端呈现之前,您无法获取浏览器中行的高度。

于 2012-05-09T09:11:30.200 回答
1

gridview 的 RowDataBound 事件处理程序中的这段代码对我有用:

protected void dgv_usersRowDatabound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowIndex == intEditIndex)
    {
        DropDownList drpCategory = e.Row.FindControl("drpCategory") as DropDownList;
        drpCategory.Focus();
    }
 }

Gridview 在每一行中都包含一个下拉列表作为 EditItemTemplate。

于 2020-09-17T16:26:02.473 回答
0

This worked for me, and required no ASP.NET AJAX, UpdatePanel or cookie, and a lot less JavaScript than other solutions I've seen.

<input type="hidden" runat="server" id="hdnScroll" value="0" />
<div style="height:600px; overflow-x:hidden; overflow-y:scroll">
  <asp:GridView runat="server" ID="myGridView" OnRowDataBound="myGridView_RowDataBound" OnSelectedIndexChanged="myGridView_SelectedIndexChanged">
...
</asp:GridView>
</div>

Then

protected void myGridView_SelectedIndexChanged(object sender, EventArgs e) {
    //if(gr != null) gr.SelectedRow.Cells[0].Focus(); // Only works on an editable cell

    hdnScroll.Value = (myGridView.SelectedIndex * (int)myGridView.RowStyle.Height.Value).ToString();
}

Finally back in the .aspx, to run upon postback

<script type="text/javascript">
$(function() {
  document.getElementById('<%=myGridView.ClientID%>').scrollTop = $('#hdnScroll').val();
});

于 2018-12-19T01:05:33.700 回答