Поместить фокус обратно на выбранную строку gridview после обратной передачи - PullRequest
1 голос
/ 05 июля 2010

Можно ли вернуть фокус на строку сетки, после чего выбор строки генерирует обратную передачу?

Я пытаюсь добавить обработчик 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();
    }

1 Ответ

0 голосов
/ 05 июля 2010

В вашем коде скрипта onkeydown скопируйте идентификатор ячейки в скрытое поле ввода.

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

приведенный выше пример - обычный html, и вам нужно будет добавить правильный код onkeydown к вашему gridview.

В своем коде обработчика события обратной передачи (например, onclick) вы можете получить идентификатор из свойства значения скрытых полей и зарегистрировать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...