Динамически добавлять событие Click к кнопке asp

У меня возникла проблема с динамическим добавлением события нажатия кнопки. Я использую сетку. один столбец этой сетки имеет кнопку. В событии 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);
            }
        }

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

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

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

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


person Sumit    schedule 10.04.2011    source источник


Ответы (3)


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

person mabeiyi    schedule 27.02.2012
comment
Я смог решить эту проблему, просто используя событие onclick в разметке, а затем имея обработчик событий для кодирования и позволяя сетке выполнять обратную публикацию. в любом случае спасибо за ответ на вопрос. Я очень ценю, что кто-то ответит на этот вопрос :) - person Sumit; 28.02.2012

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

person Sumit    schedule 09.01.2013

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

        <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

person Emeka    schedule 15.02.2014