C# 取消选中复选框时,不会激发asp:checkbox的OnCheckedChanged事件处理程序
我有一个repeater,在repeater的每个ItemTemplate中都有一个asp:checkbox和一个OnCheckedChanged事件处理程序集。复选框的AutoPostBack属性设置为true。选中任何复选框时,事件处理程序将激发。如果未选中“任何”,则不会触发事件处理程序 你知道为什么这场比赛没有打响吗?我是如何让它打响的?谢谢 简化中继器代码:C# 取消选中复选框时,不会激发asp:checkbox的OnCheckedChanged事件处理程序,c#,asp.net,c#-2.0,C#,Asp.net,C# 2.0,我有一个repeater,在repeater的每个ItemTemplate中都有一个asp:checkbox和一个OnCheckedChanged事件处理程序集。复选框的AutoPostBack属性设置为true。选中任何复选框时,事件处理程序将激发。如果未选中“任何”,则不会触发事件处理程序 你知道为什么这场比赛没有打响吗?我是如何让它打响的?谢谢 简化中继器代码: <asp:Repeater ID="rptLinkedItems" runat="server">
<asp:Repeater ID="rptLinkedItems" runat="server">
<ItemTemplate>
<asp:CheckBox ID="chkLinked" runat="server"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
</ItemTemplate>
</asp:Repeater>
OnItemDataBound事件处理程序如下所示:
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);
}
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());
}
}
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);
}
OnCheckedChanged事件处理程序如下所示:
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);
}
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());
}
}
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);
}
另外,如果有人也能告诉我为什么降价对我不起作用…请尝试在OnItemDataBound事件中重新订阅CheckChanged事件
chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
订阅页面初始化中的CheckChanged事件。这是因为当ASP.NET执行ASP.NET页面生命周期中的
控制事件部分时,控制层次结构(尤其是复选框)不存在,就像您在以后的预渲染
阶段中创建的那样。有关事件序列的更多详细概述,请参阅
对于@bleeeah的建议,我会谨慎一点,因为您正在为复选框指定一个值。选中rplinkeditems\u ItemDataBound
中的,这也会导致事件处理程序执行:
chkLinked.Checked = IsItemLinked(item);
相反,请移动:
if (!Page.IsPostBack)
{
m_linkedItems = GetLinkedItems();
rptLinkedItems.DataSource = GetLinkableItems();
rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
(rptLinkedItems_ItemDataBound);
rptLinkedItems.DataBind();
}
进入页面。加载事件处理程序。尝试使用AutoPostBack=“true”
如下:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
您必须为repeater item命令外的检查表定义eventhandler,然后在repeater item命令内,遍历检查表项目并获取检查项目
在.aspx页面中,您可以使用Ajax和updatepanel启动eventhandler,但请记住,您必须在repeater之外定义scriptmanage
//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] + ",";
}
}
}
protectedvoid Repeater1\u ItemCommand(对象发送方,RepeaterCommandEventArgs e)
{
CheckBoxList cbl=(CheckBoxList)e.Item.FindControl(“CheckBoxList1”);
cbl.SelectedIndexChanged+=新事件处理程序(chkLinked\u CheckedChanged);
字符串名称=”;
对于(int i=0;i
像这样使用AutoPostBack=“true”
:
<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
@Jibberish:RE:你的私人助理,你做得不对尝试在编辑模式下打开此问题,看看我做了哪些更改。关键点4空格前缀代码,编辑器在右侧面板中指示您执行此操作。谢谢Anthony,很抱歉我在编辑器中错过了此操作。这似乎解决了问题,谢谢。我不清楚为什么,有人能告诉我吗?这是因为每次重建页面时,动态控件的事件处理程序都必须连接起来。除非你在Init中这样做,否则框架会处理这个问题。谢谢你,这个解决了我的问题。我已经将此添加到PageLoad函数中,这样我就可以将此oncheckchanged事件链接到我的函数。谢谢,Rabid。除了如前所述重新订阅活动外,您还完成了这项工作,现在一切都完全按照预期进行。没问题,请您投票支持我的问题好吗?我非常想得到一些建议:)谢谢,这帮了我的忙:)我有一部分是正确的,自动回邮完成了我的目标!完美的解决方案,因为AutoPostBack在您更改复选框的状态后刷新页面,因此您可以正确处理属性复选框。