Событие не запускается после установки OnClientClick в RowDataBound

2

У меня есть GridView Asp.net(заполняется привязкой данных). Один из моих столбцов - ButtonField (очевидно, с его собственным CommandName).

GridView_RowCommand отлично работает, но если я добавлю GridView_RowDataBound (в котором я просто добавляю подтверждение javascript), событие GridView_RowCommand не запускается в PostBack.

Что может быть проблемой/решением?

Добавление кода для лучшего понимания:

Код Aspx:

<asp:GridView ID="GridView1" runat="server" 
    OnRowCommand="GridView1_RowCommand" 
    onrowdatabound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="MyField1" HeaderText="MyField1" />
        <asp:BoundField DataField="MyField2" HeaderText="MyField2" />
        <asp:ButtonField Text="MyAction" ButtonType="Image" ImageUrl="myaction.gif" CommandName="myaction" />
    </Columns>
</asp:GridView>

С# code:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        (e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "javascript:return confirm (\"Do action?\");";
    }
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "myaction")
    {
        DoMyAction();
    }
}

EDIT:

Я забыл сказать, что мой GridView находится внутри ajax TabContainer (AjaxControlToolkit)

Теги:

2 ответа

5
Лучший ответ

это то, что обычно испускается для кнопки "Изображение":

<input type="image" src="myaction.gif" alt="MyAction" onclick="javascript:__doPostBack('GridView1','myaction$1')" style="border-width:0px;" />

когда вы установите OnClientClick в свой код, он добавит ваш код, но все равно добавит вызов функции __doPostBack, в результате получится следующий html:

<input type="image" src="myaction.gif" alt="MyAction" onclick="javascript:return confirm('Do action?');javascript:__doPostBack('GridView1','myaction$1')" style="border-width:0px;" />

обработчик события onclick вернется, прежде чем он получит возможность правильно выполнить обратную передачу (он просто отправит форму).

Выполнение этого действия:

(e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "if (!confirm('Do action?')) { return false; }";

должно позволить клиенту на клиенте запускать функцию __doPostBack и поднять сервер событий событий RowCommand, как ожидалось, когда пользователь нажимает OK.

(В качестве побочного примечания это хороший пример одного из недостатков ASP.NET WebForms - существует много генерируемых html, которые вы просто не контролируете. ASP.NET MVC FTW!)

  • 0
    Это сработало! Спасибо! Я до сих пор удивляюсь, почему "javascript: return verify (\" Действовать? \ ");" отличается от "if (! Подтвердить ('Do action?')) {return false;}" и, кстати, вы правы: ASP.NET MVC FTW!
  • 1
    Я пытаюсь ответить самому себе: рабочая версия возвращает false, если я нажимаю «нет», но не возвращает true, если я нажимаю «да»
Показать ещё 1 комментарий
0

На первый взгляд это кажется прекрасным. Вы пытались запустить свой код вне TabContainer?

Это может привести вас в правильном направлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню