Динамически добавить событие Click к кнопке asp - PullRequest
0 голосов
/ 10 апреля 2011

У меня проблема с добавлением события нажатия кнопки динамически.Я использую сетку.один столбец этой сетки имеет кнопку.В событии Row_dataBound этой сетки я нахожу эту кнопку и добавляю обработчик события к кнопке кнопки щелчка этой сетки следующим образом.

protected void grdDisplayUserLeave_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Button btnApprove = (Button)e.Row.FindControl("btnApprove");
                Button btnDisApprove = (Button)e.Row.FindControl("btnDisApprove");

                UserLeaveDTO objUserLeave = (UserLeaveDTO)e.Row.DataItem;
                btnApprove.OnClientClick = "leaveApplication.HoldLeaveId(" + objUserLeave.LeaveId + ",'" + hdnLeaveId.ClientID + "')";
                btnDisApprove.OnClientClick = "leaveApplication.HoldLeaveId(" + objUserLeave.LeaveId + ",'" + hdnLeaveId.ClientID + "')";

                //btnApprove.Attributes.Add("onclick", "leaveApplication.HoldLeaveId("+objUserLeave.LeaveId+",'"+hdnLeaveId.ClientID+"')");
                //btnDisApprove.Attributes.Add("onclick", "leaveApplication.HoldLeaveId(" + objUserLeave.LeaveId + ",'" + hdnLeaveId.ClientID + "')");

                btnApprove.Click += new EventHandler(Handle_ApproveLeave);
                btnDisApprove.Click += new EventHandler(Handle_ApproveLeave);
            }
        }

и я объявил свой обработчик события следующим образом1004 *

protected void Handle_ApproveLeave(object sender, EventArgs e)
        {
            //long cusomerId = Convert.ToInt64(deleteItemIdValue.Value);
        }

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

спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 09 января 2013

Мне удалось решить эту проблему, просто используя событие onclick в разметке, а затем обработчик событий для кодирования и позволяя grid отправлять сообщения обратно.

0 голосов
/ 16 февраля 2014

Просто чтобы добавить немного деталей к решению.Вам нужно использовать атрибут CommandName для кнопки, а затем создать обработчик событий для всего вида сетки.Указанное вами имя команды будет передано обработчику.Вы также можете динамически добавить команду arguemnt, которая также будет передана.Вот основы моего решения:

        <asp:GridView ID="gvStudiesInProgress" DataSourceID="dsIncompleteStudies" AutoGenerateColumns="false" OnRowDataBound="gvStudiesInProgress_RowDataBound" OnRowCommand="gvStudiesInProgress_RowCommand">
        <Columns>
            <asp:BoundField DataField="physician.id" HeaderText="ID" />
            <asp:BoundField DataField="physician.firstName" HeaderText="First Name" />
            <asp:BoundField DataField="physician.lastName" HeaderText="Last Name" />
            <asp:ButtonField HeaderText="Reopen Study?" ButtonType="Button" ControlStyle-CssClass="pure-button pure-button-success pure-button-small" Text="Reopen" CommandName="Reopen" />
        </Columns>
        </asp:GridView>

Теперь в моем коде я добавляю аргумент команды к моей кнопке, когда строка данных установлена:

        protected void gvStudiesInProgress_RowDataBound(object sender, GridViewRowEventArgs e)
        {          
           // Only perform these operations on datarows, skip the header
           if (e.Row.RowType != DataControlRowType.DataRow)
              return;

           saveSet currSaveSet = (saveSet)e.Row.DataItem;

           // Add the saveSetId attribute to the row's repoen button
           ((Button)e.Row.Cells[5].Controls[0]).CommandArgument = currSaveSet.saveSetId.ToString();

        }

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

        protected void gvStudiesInProgress_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            // Allow the Reopen button to trigger a study reset
            if (e.CommandName == "Reopen")
            {
                bool reopened = DAL.reopenTimeStudy(int.Parse(e.CommandArgument.ToString()));
            }
        }

Пример с атрибутом CommandName мне очень помог: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.buttonfield.commandname(v=vs.110).aspx

0 голосов
/ 27 февраля 2012

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

...