在 RowDatabound 中创建的按钮不会触发点击事件
Posted
技术标签:
【中文标题】在 RowDatabound 中创建的按钮不会触发点击事件【英文标题】:Button created in RowDatabound doesn't fire click event 【发布时间】:2011-09-26 13:33:50 【问题描述】:我在 gridview RowDataBound 事件中添加 LinkButton,在这里我也触发了点击事件
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 事件中添加了 LinkButtons。但是当页面在点击链接按钮时回发时,它们还没有被重新创建,所以页面没有任何东西可以绑定点击事件。如果是回发,您将需要在 PreRender 事件中再次创建它们。因此,您可能还需要存储一些用于确定如何在 ViewState 中创建 LinkButtons 的信息,以便您可以在 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 执行触发器?
更改在 UITableView 中创建的 UIButton 的图像