Подтвердить что ты не робот

OnCheckedChanged обработчик события asp: checkbox не срабатывает при снятии флажка

У меня есть повторитель, в каждом ItemTemplate повторителя есть флажок asp: с установленным обработчиком события 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. Если кто-то может также сказать мне, почему уценка не работает правильно для меня...

4b9b3361

Ответ 1

Это связано с тем, что иерархия управления (и флажки в частности) не существует, когда 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.

Ответ 2

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

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

Ответ 3

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

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

Ответ 4

Используйте AutoPostBack="true" следующим образом:

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

Ответ 5

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

Ответ 6

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

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

//checklisk checkedchange eventhandler

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] + ",";
            }
        }
    }