【问题标题】:Button created in RowDatabound doesn't fire click event在 RowDatabound 中创建的按钮不会触发点击事件
【发布时间】: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 事件不起作用。

谢谢。

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案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" 添加到您的网格视图中