Evénement non déclenché après la définition de OnClientClick dans RowDataBound

J’ai un Asp.net GridView (peupler avec une liaison de données). Une de mes colonnes est un ButtonField (évidemment avec son propre CommandName).

GridView_RowCommand fonctionne parfaitement, mais si j’ajoute un GridView_RowDataBound (dans lequel j’ajoute simplement une confirmation javascript), l’événement GridView_RowCommand n’est pas déclenché dans PostBack.

Quel pourrait être le problème / solution?

Ajouter du code pour une meilleure compréhension:

Code Aspx:

       

c # code:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { (e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "javascript:return confirm (\"Do action?\");"; } } protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "myaction") { DoMyAction(); } } 

MODIFIER:

J’ai oublié de dire que mon GridView est à l’intérieur d’un TabContainer ajax (AjaxControlToolkit)

Voici ce qui est émis normalement pour le bouton Image:

  

Lorsque vous définissez OnClientClick dans votre code-behind, le code sera ajouté mais votre appel à la fonction __doPostBack sera ajouté, ce qui produira le code html suivant:

  

le gestionnaire d’événements onclick reviendra avant d’avoir la possibilité de faire la publication correctement (il ne fera que soumettre le formulaire).

Ce faisant:

 (e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "if (!confirm('Do action?')) { return false; }"; 

doit permettre à l’événement de clic côté client d’exécuter la fonction __doPostBack et de lever l’événement côté commande RowCommand comme prévu lorsque l’utilisateur clique sur OK.

(En passant, c’est un bon exemple de l’un des inconvénients d’ASP.NET WebForms: de nombreux fichiers html sont générés sur lesquels vous n’avez aucun contrôle. ASP.NET MVC FTW!)

À première vue, cela semble bien. Avez-vous essayé d’exécuter votre code en dehors de TabContainer?

Cela pourrait vous amener dans la bonne direction.

Utilisez ClientScript.GetPostBackClientHyperlink comme argument de la fonction ClientScript.GetPostBackClientHyperlink afin de créer un événement client js dinamicaly. RowDataBoundRowDataBound l’exemple de RowDataBound , où l’expéditeur est GridView (VB). YourCommand sera passé en tant qu’argument pour RowCommand événement RowCommand soit RowCommand .

 e.Row.Cells(columnIndex).Atsortingbutes.Add("onclick", ClientScript.GetPostBackClientHyperlink(sender, "YourCommand$" & e.Row.DataItemIndex))