Почему __doPostBack() JavaScript не добавляется к кнопке обновления CommandField в GridView при визуализации в HTML

У меня есть базовый GridView с CommandField который использует встроенные в CommandField кнопки "Редактировать", "Отмена", "Обновить" и "Удалить", с ButtonType свойство, установленное в "Image" (ImageButtons), определенное как:

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="false"
OnRowEditing="gv_RowEditing" OnRowCancelingEdit="gv_RowCancelingEdit" OnRowUpdating="gv_RowUpdating" OnRowDeleting="gv_RowDeleting">
<Columns>
    <asp:CommandField 
        ShowEditButton="true" ShowDeleteButton="true" ButtonType="Image"
        EditImageUrl="~\Images\Icons\gridView_Edit.png"
        CancelImageUrl="~\Images\Icons\gridView_CancelEdit.png"
        UpdateImageUrl="~\Images\Icons\gridView_Update.png"/>
</Columns>

Обработчики событий C# на стороне сервера для событий OnRowEditing, OnRowCancelingEdit, OnRowUpdating и OnRowDeleting работают нормально и определяются как:

protected void gv_RowUpdating(object sender, GridViewUpdateEventArgs e) { }
protected void gv_RowEditing(object sender, GridViewEditEventArgs e) { }
protected void gv_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { }
protected void gv_RowDeleting(object sender, GridViewDeleteEventArgs e) { }

Когда страница отображается в HTML, ImageButtons в CommandField предоставляются к следующему (упрощенный) <input> теги:

<input type="image" name="ctl00$Body$gv$ctl02$ctl00" src="Images/update.png" alt="Update" style="border-width:0px;">
<input type="image" src="Images/delete.png" alt="Delete" onclick="javascript:__doPostBack('ctl00$Body$gv','Delete$0')" style="border-width:0px;">
<input type="image" src="Images/edit.png" alt="Edit" onclick="javascript:__doPostBack('ctl00$Body$gv','Edit$0')" style="border-width:0px;">
<input type="image" src="Images/cancel.png" alt="Cancel" onclick="javascript:__doPostBack('ctl00$Body$gv','Cancel$0')" style="border-width:0px;">

ПРИМЕЧАНИЕ. На самом деле в каждый момент времени отображаются только "Редактировать / Удалить" или "Обновить / Отменить", в зависимости от того, находится ли GridView в режиме редактирования или нет.

Так почему же кнопка "Обновление" не использует функцию JavaScript __doPostBack в ASP.NET, а кнопки "Удалить", "Редактировать" и "Отмена"?

Как получается, что OnRowUpdating событие обработано?

ПРИМЕЧАНИЕ: при использовании по умолчанию ButtonType для CommandField он отображает __doPostBack, но при использовании ButtonType="Image" __doPostBack не входит.

1 ответ

Обратите внимание, что эти 4 кнопки никогда не отображаются вместе, вы можете либо "Редактировать" "Удалить", либо, после нажатия "Редактировать", вы получаете "Обновить" "Отмена".

Так что, как только вы нажмете кнопку "Изменить" и набор кнопок изменится с "Редактировать", "Удалить" на "Обновить", "Отмена", ваша кнопка "Обновить" будет иметь __doPostback прикреплен к нему.

OnRowUpdating затем обрабатывается нормально, doPostback сразу после нажатия кнопки "Редактировать".

Вы можете скачать один из моих примеров

http://www.ii.uni.wroc.pl/~wzychla/ra2829/example3a.zip

чтобы увидеть это. Просто измените тип кнопки на Image в Default.aspx и прикрепите ваши обработчики к сетке.

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