回发后,将焦点放回到gridview的选定行上 [英] Put focus back on a gridview's selected row after postback

查看:104
本文介绍了回发后,将焦点放回到gridview的选定行上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有可能将焦点放回到gridview行之后,该行的选择生成回发?



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



我拥有以下代码



网格视图

 < asp:GridView runat =serverID =gdvPersonsAutoGenerateColumns =false
onrowcreated =gdvPersons_RowCreatedonselectedindexchanged =gdvPersons_SelectedIndexChanged>
<列>
< asp:TemplateField HeaderText =Name>
< ItemTemplate>
<%#((GridviewFocus.Person)Container.DataItem).Name%>
< / ItemTemplate>
< / asp:TemplateField>
< asp:TemplateField HeaderText =年龄>
< ItemTemplate>
<%#((GridviewFocus.Person)Container.DataItem).Age%>
< / ItemTemplate>
< / asp:TemplateField>
< /列>
< / 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 ,年龄= 35}};
gdvPersons.DataSource = persons;
gdvPersons.DataBind();


protected void gdvPersons_RowCreated(object sender,System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if(e.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();


解决方案

在您的onkeydown脚本代码副本

 < input type =textid =gridviewcell_idonkeydown = lastcell.value = this.id/> 
< input type =hiddenid =lastcellrunat =server/>

上面的示例是纯html,您必须将正确的onkeydown代码添加到您的gridview。

在您的回发(例如onclick)事件处理程序代码中,您可以从隐藏字段value属性中检索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();


Is it possible to put focus back on a gridview row after that a selection of the row generates a postback?

I'm trying to add an onkeydown handler on the gridview rows in order to use the keyboard for navigation. My problem, I believe, is that after the first postback, the selected cell loses focus, and so the next key stroke is not caught by the cell.

I have the following code

The grid view

    <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>

The Code behind

    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();
    }

解决方案

On your onkeydown script code copy the id of the cell to a hidden input field.

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

the example above is plain html, and you would have to add the proper onkeydown code to your gridview.

In your postback (for example onclick) event handler code you can retrieve the id from the hidden fields value property and register javascript to execute once the page is refreshed. If you have a button which is clicked which performs the postback you could do something like this:

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);

}

This should make your page execute the following script once it's loaded, and the control should retrive focus:

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

这篇关于回发后,将焦点放回到gridview的选定行上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆