Событие GridView RowCommand не срабатывает

У меня есть GridView, который выглядит примерно так:

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

Вот RowCommand:

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

Нажатие кнопки не запускает событие RowCommand вообще. Тем не менее, RowCommand срабатывает, когда я нажимаю индекс страницы в пейджере GridView.

Ответы

Ответ 1

Вы должны не связывать свою сетку с postbacks в Page_Load, только когда что-то изменилось, что заставляет Grid перезагружать данные (например, сортировку, пейджинг) и только в соответствующих обработчиках событий.

Другая возможная причина: отключили ли вы ViewState где-нибудь?

Ответ 2

У меня только был коллега, который столкнулся с той же проблемой; его вызвал атрибут onrowcommand=, который не устанавливается в элементе asp:GridView. Это должно быть указано на имя обработчика, который будет обрабатывать событие.

... на всякий случай у кого-то такая же проблема!

Ответ 3

Используйте тег CausesValidation="false" в теге. Это может решить проблему.

Ответ 4

Поместите grid.Databind() внутрь if (!IsPostBack)

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

Ответ 5

Если ваш код такой:

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

    }
}

Поместите BindGrid() внутри блока !isPostBack

Ответ 6

Вы также можете проверить HttpContext.Current.Request.Form [ "__ EVENTTARGET" ], и если он заканчивается идентификатором элемента управления, переустановите GridView и используйте Page.FindControl с целевым объектом, чтобы найти элемент управления, который запускал событие

Ответ 7

Моя проблема была requiredfieldvalidator

Решение было следующим: я отключил его при отправке назад, а затем снова включил его после команды row.

Ответ 8

Пробовал вышеупомянутые ответы и до сих пор не смог получить сообщение назад. Завершена проблема Уникальный идентификатор. У меня было два <ItemTemplate> с кнопками с одинаковыми идентификаторами. (В разных сетках. Моя вторая была в User Control)

Изменение <asp:Button ID="" /> на уникальный идентификатор решило проблему с обратной записью для меня.

Просто подумал, что я отправлю кому-нибудь еще, кто попробовал другие варианты, не повезло.