Обработчик событий OnCheckedChanged asp:checkbox не срабатывает, когда флажок снят

StackOverflow https://stackoverflow.com/questions/1404528

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть повторитель, в каждом ItemTemplate повторителя есть флажок asp:checkbox с установленным обработчиком событий OnCheckedChanged.Для флажков свойство AutoPostBack установлено в значение true.Когда какой-либо из флажков установлен, срабатывает обработчик событий.Если какой-либо флажок не выбран, обработчик событий не срабатывает.

Есть идеи, почему событие не срабатывает и как мне его заставить?Спасибо.

Упрощенный код ретранслятора:

<asp:Repeater ID="rptLinkedItems" runat="server">            
    <ItemTemplate>      
    <asp:CheckBox ID="chkLinked" runat="server" 
     Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
    </ItemTemplate>    
</asp:Repeater>

Коллекция привязана к ретранслятору следующим образом:

protected override void OnPreRenderComplete(EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                m_linkedItems = GetLinkedItems();
                rptLinkedItems.DataSource = GetLinkableItems();
                rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
                       (rptLinkedItems_ItemDataBound);
                rptLinkedItems.DataBind();
            }

            base.OnPreRenderComplete(e);
        }

Обработчик событий OnItemDataBound выглядит следующим образом:

private void rptLinkedItems_ItemDataBound(Object sender, RepeaterItemEventArgs args)
        {
            if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
            {
                CategoryItem item = args.Item.DataItem as CategoryItem;

                Literal litItemName = args.Item.FindControl("litItemName") as Literal;
                CheckBox chkLinked = args.Item.FindControl("chkLinked") as CheckBox;

                litItemName.Text = item.Text;

                chkLinked.Checked = IsItemLinked(item);
                chkLinked.AutoPostBack = true;
                chkLinked.InputAttributes.Add("Value", item.Id.ToString());
            }
        }

Обработчик событий OnCheckedChanged выглядит следующим образом:

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
            CheckBox linkedItem = sender as CheckBox;
            Boolean itemState = linkedItem.Checked;
            Int32 itemId = Int32.Parse(linkedItem.InputAttributes["Value"].ToString());
            DataAccessLayer.UpdateLinkedItem(m_linkingItem, Utilities.GetCategoryItemFromId(itemId), itemState);
}

P.S.Если кто-нибудь также может сказать мне, почему у меня уценка работает неправильно...

Это было полезно?

Решение

Это связано с тем, что иерархия элементов управления (и флажки в частности) не существует, когда ASP.NET выполняет Control events часть жизненного цикла страницы ASP.NET в том виде, в котором вы создали их позже. PreRender этапы.Пожалуйста, посмотри Обзор жизненного цикла страницы ASP.NET для более подробного обзора последовательности событий.

Я бы с осторожностью отнесся к совету @bleeeah, поскольку вы присваиваете значение CheckBox.Checked внутри rptLinkedItems_ItemDataBound, что также приведет к выполнению обработчика событий:


chkLinked.Checked = IsItemLinked(item);

Вместо этого переместите:


if (!Page.IsPostBack)
   {
      m_linkedItems = GetLinkedItems();
      rptLinkedItems.DataSource = GetLinkableItems();
      rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
          (rptLinkedItems_ItemDataBound);
      rptLinkedItems.DataBind();
   }

в Page.Load обработчик события.

Другие советы

Попробуйте использоватьAutoPostBack="true" так:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>

Попробуйте повторно подписаться на событие CheckChanged в событии OnItemDataBound,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Использовать AutoPostBack="true" так:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />

Подпишитесь на событие CheckChanged в вашем Page_Init.

Вам необходимо определить обработчик событий для контрольного списка из команды элемента повторителя, затем внутри команды элемента повторителя просмотреть элементы контрольного списка и получить проверенные элементы.

На странице .aspx вы можете использовать Ajax и панель обновления для запуска обработчика событий, но имейте в виду, что вам нужно определить управление сценариями вне повторителя.

// обработчик события checklistcheckedchange

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
        {
        }

и элемент команды повторителя элемента:// перебираем элементы контрольного списка и обнаруживаем отмеченные

    protected void Repeater1_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
        CheckBoxList cbl = (CheckBoxList)e.Item.FindControl("CheckBoxList1");
        cbl.SelectedIndexChanged += new EventHandler(chkLinked_CheckedChanged);

        string name = "";
        for (int i = 0; i < cbl.Items.Count; i++)
        {
            if (cbl.Items[i].Selected)
            {
                name += cbl.Items[i].Text.Split(',')[0] + ",";
            }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top