【问题标题】:OnCheckedChanged event handler of asp:checkbox does not fire when checkbox is unchecked未选中复选框时,asp:checkbox 的 OnCheckedChanged 事件处理程序不会触发
【发布时间】: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,很抱歉我在编辑器中错过了这一点。

标签: c# asp.net c#-2.0


【解决方案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。除了像之前提到的那样重新订阅活动之外,已经做到了这一点,现在一切都按预期工作了。
  • 没问题,你能投票给我的问题stackoverflow.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] + ",";
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 2016-04-13
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多