【问题标题】:Event binding to each LinkButton of Repeater not working与Repeater的每个LinkBut​​ton的事件绑定不起作用
【发布时间】:2019-01-01 07:30:17
【问题描述】:

我需要在 C#(asp.net) 中为每一项中继器设置一个按钮。

<com:Repeater runat="server" ID="list_repeater">
  <ItemTemplate>
    <tr>
      <td>
        <asp:LinkButton runat="server" ID="btnCancel" CommandArgument='<%# Eval("id") %>'>Cancel</asp:LinkButton>
      </td>
      ...
    </tr>
  </ItemTemplate>
</com:Repeater>

我在 PageLoad 中绑定数据。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        list_repeater.DataSource = ... getData ..;
        list_repeater.DataBind();
        ...
    }
}

当然,我在列表上绑定RepeaterItemEventHandler。

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    base.LoadingControlAdd();
    ...
    list_repeater.ItemDataBound += new RepeaterItemEventHandler(list_repeater_ItemDataBound);
    ...
}

然后我将 EventHandler 绑定到每个 btnCancel。

protected void list_repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        LinkButton btnCancel = e.Item.FindControl("btnCancel") as LinkButton;
        btnCancel.Click += new EventHandler(btnCancel_Click);
    }
}

但是,它不起作用。 当我单击每个项目的 btnCancel 时,不会触发 btnCancel_Click。我觉得我做得很好,找不到任何缺陷。上面的代码有什么问题吗,请告诉我有什么问题。谢谢。 (CommnadArgument 上的 id 设置正确,不要介意)

【问题讨论】:

    标签: c# asp.net eventhandler


    【解决方案1】:

    我解决了。

    参考:https://forums.asp.net/t/1680429.aspx?bind+event+handler+for+dynamic+controls+in+repeater

    据我所知,调用 DataBind() 时会使用“itemDataBound”事件。但是,数据绑定过程通常可以在 if (!IsPostBack){……} 的主体中完成,所以你永远不能再调用 DataBind(),我猜原因是这样的。

    为了解决这个问题,你可以试着把代码写成这样:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            list_repeater.DataSource = ... getData ..;
            list_repeater.DataBind();
            ...
        }
        ...
        foreach(RepeaterItem item in list_repeater.Items) {
            if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                LinkButton btnCancel = item.FindControl("btnCancel") as LinkButton;
                btnCancel.Click += new EventHandler(btnCancel_Click);
            }
        }
    

    这是由于我对 asp.net 的了解不足造成的。很抱歉在发布问题后几分钟内自行回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多