动态添加Click事件到asp按钮

时间:2011-04-10 15:49:47

标签: events button click add dynamic

我在动态添加按钮点击事件时遇到问题。 我正在使用网格。该网格的一列有一个按钮。在该网格的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);
        }

但问题是我没有在点击按钮时调用此事件处理程序。 谁能告诉我我做错了什么?

提前感谢。

3 个答案:

答案 0 :(得分:0)

我认为这是一个回发问题。因为只要有人分配事件处理程序,就应该在理想的页面加载之前完成。

答案 1 :(得分:0)

我能够解决这个问题,只需在标记中使用onclick事件,然后使用事件处理程序代码隐藏,并允许网格进行回发。

答案 2 :(得分:0)

只是为解决方案添加更多细节。您需要为该按钮使用CommandName属性,然后为整个gridview创建一个事件处理程序。您指定的命令名称将传递给处理程序。您还可以动态添加也将传递的命令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();

        }

最后,我为整个gridview创建一个事件处理程序,并根据按钮的命令名和命令参数属性处理回发。

        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