未选中复选框时,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 事件处理程序不会触发的主要内容,如果未能解决你的问题,请参考以下文章

检查两个复选框是不是未选中并禁用按钮

重力形式:AJAX 加载的复选框在错误验证时未选中

React Update Fetch on Checkbox Click

通过ajax发送未选中的复选框值

在继续之前如何验证复选框是不是被选中?

页面加载时,显示选中或未选中的复选框