Обработчик событий OnCheckedChanged asp:checkbox не срабатывает, когда флажок снят
Вопрос
У меня есть повторитель, в каждом 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] + ",";
}
}
}