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

时间:2016-07-29 14:56:47

标签: c# asp.net gridview

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

在行数据绑定事件中,LinkBut​​ton会分配它的点击事件处理程序。

我已经尝试过每一种方法都可以找到连接点击,甚至没有任何事件发生。

我做错了吗?

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";
    };

1 个答案:

答案 0 :(得分:0)

如果您想注册事件处理程序,

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上以声明方式注册处理程序会更容易。