2010-07-05 2 views
1

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

Я пытаюсь добавить обработчик onkeydown в строки gridview, чтобы использовать клавиатуру для навигации. Моя проблема, я полагаю, заключается в том, что после первого обратного вызова выбранная ячейка теряет фокус, и поэтому следующий ход ключа не попадает в ячейку.

У меня есть следующий код

виде таблицы

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

ответ

0

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

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

выше пример ясно HTML, и вы должны добавить код нужного OnKeyDown к вашему GridView.

В вашем обработчике события postback (например, 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); 

} 

Это должно сделать вашу страницу выполнить следующий сценарий, как только он будет загружен, и контроль должен retrive фокуса:

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

У меня было решение, но у меня возникли проблемы с идентификаторами строк gridview. Я включил свой исходный код на вопрос – Fikre

+0

. В коде, который вы опубликовали, нет полей редактирования. Итак, как вы собираетесь делать навигацию? Не могли бы вы предоставить более полный образец, и используете ли вы .net3.5 или 4.0? –

+0

Я добавляю событие onkeydown в каждую строку в событии gdvPersons_RowCreated. Проблема с моим кодом заключается в том, что для строки таблицы необходим указатель табуляции, чтобы быть ориентируемым. Я также изменил gdvPersons.SelectedRow.Focus(); с вашим кодом для фокусировки строки, поэтому я отметил его как ответ. благодаря – Fikre

Смежные вопросы