【问题标题】:Put focus back on a gridview's selected row after postback回发后将焦点重新放在gridview的选定行上
【发布时间】:2010-07-05 18:37:41
【问题描述】:

在选择行生成回发之后,是否可以将焦点放回 gridview 行?

我正在尝试在 gridview 行上添加一个 onkeydown 处理程序,以便使用键盘进行导航。我相信我的问题是,在第一次回发之后,所选单元格失去焦点,因此下一个击键不会被单元格捕获。

我有以下代码

网格视图

    <asp:GridView runat="server" ID="gdvPersons" AutoGenerateColumns="false" 
        onrowcreated="gdvPersons_RowCreated" onselectedindexchanged="gdvPersons_SelectedIndexChanged">
        <Columns>
            <asp:TemplateField HeaderText="Name">
                <ItemTemplate>
                    <%# ((GridviewFocus.Person) Container.DataItem).Name %>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Age">
                <ItemTemplate>
                    <%# ((GridviewFocus.Person) Container.DataItem).Age %>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

背后的代码

    protected void Page_Load(object sender, EventArgs e)
    {
        var persons = new List<Person> {new Person() {Name = "Fikre", Age = 24}, 
                                        new Person() {Name = "Mike", Age = 29},
                                        new Person() {Name = "Mark", Age = 35}};
        gdvPersons.DataSource = persons;
        gdvPersons.DataBind();
    }

    protected void gdvPersons_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
            e.Row.Attributes.Add("onkeydown", ClientScript.GetPostBackEventReference((Control)sender, "Select$" + e.Row.DataItemIndex));
    }

    protected void gdvPersons_SelectedIndexChanged(object sender, EventArgs e)
    {
        gdvPersons.SelectedRow.Focus();
    }

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    在您的 onkeydown 脚本代码中,将单元格的 id 复制到隐藏的输入字段。

    <input type="text" id="gridviewcell_id" onkeydown="lastcell.value = this.id" />
    <input type="hidden" id="lastcell" runat="server" />
    

    上面的例子是纯 html,你必须在你的 gridview 中添加正确的 onkeydown 代码。

    在您的回发(例如 onclick)事件处理程序代码中,您可以从隐藏字段值属性中检索 id 并注册 javascript 以在页面刷新后执行。如果你有一个被点击的按钮来执行回发,你可以这样做:

    protected void MyButton_Click(object sender, EventArgs e)
    {
       string id = lastcell.Value;
       string script = "var ctrl = document.getElementById('" + lastcell.Value + "');";
       script += "ctrl.focus();";
       ClientScript.RegisterClientScriptBlock(this.GetType(), 
           "focusScript", script, true);
    
    }
    

    这应该使您的页面在加载后执行以下脚本,并且控件应该检索焦点:

    var ctrl = document.getElementById("yourid"); 
    ctrl.focus();
    

    【讨论】:

    • 我尝试了您的解决方案,但我在使用 gridview 的行 ID 时遇到了问题。我在问题中包含了我的原始代码
    • 您发布的代码中没有编辑字段。那么你打算怎么做导航呢?您能否提供更完整的示例,您使用的是 .net3.5 还是 4.0?
    • 我将 onkeydown 事件添加到 gdvPersons_RowCreated 事件中的每一行。我的代码的问题是表格行需要一个选项卡索引才能获得焦点。我还更改了 gdvPersons.SelectedRow.Focus();使用您的代码来聚焦行,所以我将其标记为答案。谢谢
    【解决方案2】:

    在 .aspx 文件的 @Page 指令中添加 MaintainScrollPositionOnPostBack="true" 或将其添加到 web.config 中的 system.web/pages section

    <system.web>
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" maintainScrollPositionOnPostBack="true"/>
    </system.web>
    

    这也适用于使用大表格导航到上一页时,例如

    当网页被回发到服务器时,用户被返回到页面的顶部。在长网页上,这意味着用户必须将页面滚动回页面上的最后一个位置。

    Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      相关资源
      最近更新 更多