在 RowDatabound 中创建的按钮不会触发点击事件

Posted

技术标签:

【中文标题】在 RowDatabound 中创建的按钮不会触发点击事件【英文标题】:Button created in RowDatabound doesn't fire click event 【发布时间】:2011-09-26 13:33:50 【问题描述】:

我在 gridview RowDataBound 事件中添加 LinkBut​​ton,在这里我也触发了点击事件

        protected void cgvProjectPropertyList_RowDataBound(object sender, GridViewRowEventArgs e)


    if (e.Row.RowType == DataControlRowType.DataRow)
    

        LinkButton lnkDelete = new LinkButton();
        lnkDelete.Text = "Delete";
        e.Row.Cells[COL_INDEX_DELETE].Controls.Add(lnkDelete);
        lnkDelete.CommandName = "Delete";

        lnkDelete.Click += new EventHandler(lnkDelete_Click);
    


void lnkDelete_Click(object sender, EventArgs e)



lnkDelete_Click 事件不起作用。

谢谢。

【问题讨论】:

【参考方案1】:

问题是由于您正在动态添加LinkButton 控件这一事实引起的,这在 ASP.NET WebForms 中是一种非常痛苦的方法。

为了使 ASP.NET 中的事件起作用,控件必须在 Load 事件之后存在,因为那是触发控件事件的时间。否则没有任何Linkbutton 可以绑定点击事件。

我的建议是您尝试在标记中添加LinkButton。它将为您节省很多痛苦。然后,您可以改用GridView 上的RowCommand

如果这不是一个选项,您必须在 Load 事件中添加 Linkbutton 并在那里为其单击事件注册一个处理程序。

我有一个post 正在使用ListView,它正在使用这种方法。你应该能够从中吸取教训。

【讨论】:

如果您可以选择这样做,这是最好的方法。另外,请查看 ASP.NET 页面生命周期。如果您了解这一点,您将在 ASP.NET 中提高工作效率:msdn.microsoft.com/en-us/library/ms178472.aspx【参考方案2】:

尝试在void lnkDelete_Click(object sender, EventArgs e)前面加上public

这有时会造成一些问题

【讨论】:

我试过了,还是不行。这不是问题,因为代码在同一个类中。 好吧,我不知道,但你可以在标记中添加按钮,然后将其隐藏在不需要或不应该存在的地方【参考方案3】:

问题是您在 gridview 的 RowDataBound 事件中添加了 LinkBut​​tons。但是当页面在点击链接按钮时回发时,它们还没有被重新创建,所以页面没有任何东西可以绑定点击事件。如果是回发,您将需要在 PreRender 事件中再次创建它们。因此,您可能还需要存储一些用于确定如何在 ViewState 中创建 LinkBut​​tons 的信息,以便您可以在 PreRender 中重新创建它们。完成此操作后,页面将可以使用控件将事件绑定到,并且您的处理程序将被调用。

【讨论】:

【参考方案4】:

你可以改用RowCommand,比如..

 protected void cgvProjectPropertyList_RowCommand(object sender, GridViewCommandEventArgs e)

    if (e.CommandName == "Delete")
    
      e.CommandArgument // will Return current Row primary key value, rather row Index
    

并且您需要确保在 GridView OnRowCommand="cgvProjectPropertyList_RowCommand" 中注册事件

【讨论】:

您需要将 OnRowCommand="cgvProjectPropertyList_RowCommand" 添加到您的网格视图中

以上是关于在 RowDatabound 中创建的按钮不会触发点击事件的主要内容,如果未能解决你的问题,请参考以下文章

如何基于 Azure 数据工厂中创建的 Blob 执行触发器?

我可以从 Python 触发在 KV 文件中创建的屏幕吗?

更改在 UITableView 中创建的 UIButton 的图像

如何定期运行在CDK中创建的Lambda?

如何在故事板中创建的 UITableView 中隐藏单元格?

朋友不会被邀请参加 Facebook 中创建的活动