LinkButton.Click事件在GridView行数据绑定中动态附加时未触发

本文关键字:动态 事件 Click GridView 数据绑定 LinkButton | 更新日期: 2023-09-27 17:59:10

我在asp:UpdatePanel中有一个asp:GridView,它有一列asp:LinkButton控件。

在行数据绑定事件上,LinkButton将为其分配点击事件处理程序。

我已经尽了一切可能将点击连接起来,但没有一个事件发生。

我做错什么了吗?

aspx:

<asp:UpdatePanel ID="MainUpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Label ID="lblTest" Text="test" runat="server" />
        <asp:GridView ID="gvClientsArchive" runat="server" AllowSorting="true" DataSourceID="dsClients" 
            OnRowDataBound="gvClientsArchive_RowDataBound" SkinID="gvList"
            AllowPaging="true" PageSize="25" Visible="false">
        ...

代码背后:

protected void gvClientsArchive_RowDataBound(object sender, GridViewRowEventArgs e)
{
    ...
    int company_id = int.Parse(drvRow["company_id"].ToString());
    LinkButton lnkRestore = (LinkButton)e.Row.FindControl("lnkRestore");
    lnkRestore.Click += new System.EventHandler(this.doRestore);

按钮处理程序代码:

private void doRestore(object sender, EventArgs e)
{
    lblTest.Text = "restore clicked";
}

我也试过:

protected void gvClientsArchive_RowDataBound(object sender, GridViewRowEventArgs e)
{
    ...
    LinkButton lnkRestore = (LinkButton)e.Row.FindControl("lnkRestore");
    lnkRestore.Click += delegate
    {
        lblTest.Text = "restore clicked";
    };

LinkButton.Click事件在GridView行数据绑定中动态附加时未触发

如果要注册事件处理程序,

RowDataBound是不合适的。使用RowCreated:

protected void gvClientsArchive_RowCreated(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType ==  DataControlRowType.DataRow)
    {
        LinkButton lnkRestore = (LinkButton)e.Row.FindControl("lnkRestore");
        lnkRestore.Click += new System.EventHandler(this.doRestore);
    }
}

只有当您对网格进行数据绑定时才会触发RowDataBound,而不是在每次需要的回发时进行数据绑定,因为所有控件都是在页面生命周期结束时释放的。现在也太晚了。

如果使用TemplateFields,那么在aspx上以声明方式注册处理程序会更容易。