Событие 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.

8 ответов

Решение

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

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

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

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

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

Положить grid.Databind() внутри if (!IsPostBack)

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

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

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



     }




}

положить в BindGrid() внутри строки isposback{}

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

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

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

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

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

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

Я исправил свою версию этой проблемы, удалив все обработчики событий из GridView, затем перестроив код и добавив их обратно по одному.

Сделал их все и ни к чему не пришел, затем обнаружил это: onrowcommand="GridView1_RowCommand" в строке определения GridView1 в html.

Другие вопросы по тегам