Не работает привязка событий к каждому LinkButton of Repeater - PullRequest
0 голосов
/ 01 января 2019

Мне нужно установить кнопку для каждого элемента репитера в 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 установлен правильно, не обращайте на это внимания)

1 Ответ

0 голосов
/ 01 января 2019

Решено.

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

Насколько я знаю, событие itemDataBound используется при вызове DataBind (),Однако процесс связывания данных обычно можно выполнить в теле 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.Извините за автоответчик через несколько минут после публикации вопроса.

...