【发布时间】:2009-09-10 10:36:59
【问题描述】:
我有一个转发器,在转发器的每个 ItemTemplate 中都是一个带有 OnCheckedChanged 事件处理程序集的 asp:checkbox。复选框的 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);
}
附:如果有人也可以告诉我为什么降价对我不起作用......
【问题讨论】:
-
@Jibberish: RE: 你的 P.S.你做的不对。 ;) 尝试在编辑模式下打开这个问题,看看我做了什么改变。代码前缀的关键点 4 个空格,编辑器会在右侧面板中指示您执行此操作。
-
感谢 Anthony,很抱歉我在编辑器中错过了这一点。