我有一个转发器,在转发器的每个ItemTemplate中都是一个带有OnCheckedChanged事件处理程序集的asp:复选框。复选框将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。如果有人也可以告诉我为什么降价对我不起作用......
答案 0 :(得分:37)
尝试使用AutoPostBack="true"
,如下所示:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
答案 1 :(得分:16)
这是因为当ASP.NET执行ASP.NET页面生命周期的Control events
部分时,控件层次结构(特别是复选框)不存在,因为您在以后创建它们PreRender
个阶段。有关事件序列的详细概述,请参阅ASP.NET Page Life Cycle Overview。
我会谨慎对待@ 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 :(得分:5)
尝试重新订阅ItemDataBound事件中的CheckedChanged事件,
chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
答案 3 :(得分:3)
像这样使用AutoPostBack="true"
:
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
答案 4 :(得分:2)
订阅Page_Init中的CheckChanged事件。
答案 5 :(得分:0)
您必须为repeater item命令中的checklist定义eventhandler,然后在repeater item命令中,检查清单项并获取检查项。
在.aspx页面中,您可以使用Ajax和updatepanel来触发事件处理程序,但请记住,您必须在转发器之外定义脚本管理。
// checklisk checkedchange eventhandler
protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
}
和item repeater命令项: //迭代核对表项并检测已检查的
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] + ",";
}
}
}