Обработчик события OnCheckedChanged флажка asp: не срабатывает, если флажок не установлен - PullRequest
24 голосов
/ 10 сентября 2009

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

Ответы [ 6 ]

37 голосов
/ 21 ноября 2011

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

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
16 голосов
/ 10 сентября 2009

Это связано с тем, что иерархия элементов управления (и, в частности, флажки) не существует, когда ASP.NET выполняет часть Control events жизненного цикла страницы ASP.NET, как вы их создали в более позднем * 1002. * этапы. См. Обзор жизненного цикла страницы 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.

5 голосов
/ 10 сентября 2009

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

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
3 голосов
/ 26 июля 2016

Используйте AutoPostBack="true" как это:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
2 голосов
/ 10 сентября 2009

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

0 голосов
/ 16 августа 2013

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

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

// checklisk checkedchange обработчик событий

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