web-dev-qa-db-fra.com

L'événement GridView RowCommand ne se déclenche pas

J'ai un GridView qui ressemble à ceci:

<asp:GridView 
    ID="GridView1"
    AllowPaging="true"
    OnRowCommand="RowCommand"
    OnPageIndexChanging="gridView_PageIndexChanging"
    Runat="server">
    <Columns>
        ...
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="Button1" ButtonType="Button" CommandName="ItemExport" CommandArgument='<%# Eval("EXPORT") %>'
                    Text="Export" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
        ...
    </Columns>
 </asp:GridView>

Voici RowCommand:

protected void RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "ItemExport")
    {
        // etc.
    }
}

Cliquer sur le bouton ne déclenche pas du tout l'événement RowCommand. Cependant, RowCommand se déclenche lorsque je clique sur un index de page dans le pager de GridView.

16
Tyler Treat

Vous devez non lier votre grille sur les publications dans Page_Load, uniquement en cas de modification modifiant le mode de chargement de la grille (par exemple, le tri, la pagination) et uniquement dans les gestionnaires d'événements appropriés. 

Autre raison possible: avez-vous désactivé ViewState quelque part?

47
Rango

Je viens d'avoir un collègue qui a rencontré le même problème; Cela est dû au fait que l'attribut onrowcommand= n'a pas été défini dans l'élément asp:GridView. Cela doit être défini sur le nom du gestionnaire qui gérera l'événement.

... juste au cas où quelqu'un aurait le même problème!

4
icecreamsoop

Utilisez CausesValidation="false" dans la balise button. Cela peut résoudre le problème.

3
ShaileshDev

Placez la grid.Databind() dans la if (!IsPostBack)

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        grid.DataBind();
    }
}
3
Glenio Labeca Filho

si votre code ressemble à ceci:

 protected void Page_Load(object sender, EventArgs e)
{
   BindGrid(dgv);
    if (!IsPostBack)
    {



     }




}

mis dans le BindGrid () à l'intérieur de la ligne isposback {}

2
shafeer

Vous pouvez également vérifier le HttpContext.Current.Request.Form ["__ EVENTTARGET"] et s’il se termine par l’ID du contrôle, relier le GridView et utiliser Page.FindControl avec le target event pour trouver le contrôle qui a déclenché l’événement

1
user1760527

J'ai essayé les réponses ci-dessus et je ne pouvais toujours pas récupérer mon message. En fin de compte être un ID unique problème. J'avais deux <ItemTemplate> avec des boutons qui avaient les mêmes identifiants. (Dans différentes vues de grille. Ma deuxième était dans un contrôle utilisateur) 

Le fait de changer le <asp:Button ID="" /> en un identifiant unique a résolu le problème de post-traitement pour moi.

Je pensais que je publierais pour quelqu'un d'autre qui aurait essayé les autres options sans succès.

0
clamchoda

Mon problème était requiredfieldvalidator

La solution à ce problème était la suivante: je le désactive dès la publication, puis je le réactive après la commande row.

0
Sheri Morgan