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