2010-07-05 5 views
1

Est-il possible de remettre le focus sur une ligne gridview après qu'une sélection de la ligne génère une publication?Remettre le focus sur la ligne sélectionnée d'un gridview après la publication

J'essaie d'ajouter un gestionnaire onkeydown sur les lignes grilleview afin d'utiliser le clavier pour la navigation. Mon problème, je crois, est qu'après la première publication, la cellule sélectionnée perd le focus, et donc le coup de touche suivant n'est pas attrapé par la cellule.

J'ai le code suivant

La vue grille

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

Le code derrière

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

Répondre

0

Sur votre code de script onkeydown Copiez l'ID de la cellule à un champ caché.

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

l'exemple ci-dessus est la version HTML brut, et vous devez ajouter le code onkeydown approprié à votre gridview.

Dans votre code de gestionnaire d'événements de publication (par exemple onclick), vous pouvez récupérer l'ID de la propriété value des champs cachés et enregistrer javascript pour qu'il s'exécute une fois la page actualisée. Si vous avez un bouton qui est cliqué qui exécute le postback vous pouvez faire quelque chose comme ceci:

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

} 

Cela devrait rendre votre page exécuter le script suivant une fois qu'il est chargé, et le contrôle doit retrive mise au point:

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

J'ai essayé votre solution, mais j'ai des problèmes avec les identifiants des lignes du gridview. J'ai inclus mon code original à la question – Fikre

+0

Il n'y a pas de champs d'édition dans le code que vous avez posté. Alors, comment avez-vous l'intention de faire de la navigation? Pourriez-vous fournir un échantillon plus complet et utilisez-vous .net3.5 ou 4.0? –

+0

Im ajoutant l'événement onkeydown à chaque ligne de l'événement gdvPersons_RowCreated. Le problème avec mon code est qu'une ligne de table a besoin d'un index de tabulation pour être mise au point. J'ai également changé gdvPersons.SelectedRow.Focus(); avec votre code pour la mise au point de la rangée, donc je l'ai marqué comme la réponse. Merci – Fikre

Questions connexes