未选中复选框时,asp:checkbox 的 OnCheckedChanged 事件处理程序不会触发
Posted
技术标签:
【中文标题】未选中复选框时,asp:checkbox 的 OnCheckedChanged 事件处理程序不会触发【英文标题】:OnCheckedChanged event handler of asp:checkbox does not fire when checkbox is unchecked 【发布时间】: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,很抱歉我在编辑器中错过了这一点。 【参考方案1】:尝试像这样使用AutoPostBack="true"
:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
【讨论】:
我有一部分是正确的,AutoPostBack 完成了我的目标! 完美的解决方案,因为 AutoPostBack 在您更改复选框的状态后刷新页面,因此您可以正确处理属性 checkbox_checkchanged。【参考方案2】:这是因为当 ASP.NET 执行 ASP.NET 页面生命周期的 Control events
部分时,控件层次结构(尤其是复选框)不存在,正如您在后面的 @987654324 中创建的那样@阶段。请参阅ASP.NET Page Life Cycle Overview 了解事件序列的更详细概述。
对于@bleeeah 的建议,我会谨慎行事,因为您在rptLinkedItems_ItemDataBound
中为CheckBox.Checked
分配了一个值,这也会导致事件处理程序执行:
chkLinked.Checked = IsItemLinked(item);
相反,移动:
if (!Page.IsPostBack)
m_linkedItems = GetLinkedItems();
rptLinkedItems.DataSource = GetLinkableItems();
rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
(rptLinkedItems_ItemDataBound);
rptLinkedItems.DataBind();
进入Page.Load
事件处理程序。
【讨论】:
谢谢,Rabid。除了像之前提到的那样重新订阅活动之外,已经做到了这一点,现在一切都按预期工作了。 没问题,你能投票给我的问题***.com/questions/1368403吗?我迫切需要一些建议:)【参考方案3】:尝试在 OnItemDataBound 事件中重新订阅 CheckChanged 事件,
chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
【讨论】:
这似乎已经解决了问题,谢谢。我不清楚为什么,有人可以启发我吗? 之所以有效,是因为每次重建页面时都必须连接动态控件的事件处理程序。 除非您在 Init 中执行此操作,否则框架会处理此问题。 谢谢这个解决了我的问题。我已将此添加到 PageLoad 函数中,因此我可以将此 oncheckchanged 事件链接到我的函数。【参考方案4】:像这样使用AutoPostBack="true"
:
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
【讨论】:
谢谢,这对我有帮助:)【参考方案5】:订阅 Page_Init 中的 CheckChanged 事件。
【讨论】:
【参考方案6】:您必须在中继器项目命令之外为清单定义事件处理程序,然后在中继器项目命令中,通过清单项目并获取检查项目。
在 .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] + ",";
【讨论】:
以上是关于未选中复选框时,asp:checkbox 的 OnCheckedChanged 事件处理程序不会触发的主要内容,如果未能解决你的问题,请参考以下文章