当取消选中复选框时,asp:复选框的OnCheckedChanged事件处理程序不会触发

Jas*_*son 24 c# asp.net c#-2.0

我有一个转发器,在转发器的每个ItemTemplate中都是一个带有OnCheckedChanged事件处理程序集的asp:复选框.复选框将AutoPostBack属性设置为true.选中任何复选框时,将触发事件处理程序.如果未选中任何内容,则不会触发事件处理程序.

知道为什么事件不会发生,以及我如何解雇它?谢谢.

简化的转发器代码:

<asp:Repeater ID="rptLinkedItems" runat="server">            
    <ItemTemplate>      
    <asp:CheckBox ID="chkLinked" runat="server" 
     Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />
    </ItemTemplate>    
</asp:Repeater>
Run Code Online (Sandbox Code Playgroud)

该集合与中继器绑定如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

PS如果有人也能告诉我为什么降价对我不起作用...

小智 40

尝试使用AutoPostBack="true"这样:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>
Run Code Online (Sandbox Code Playgroud)


Rab*_*bid 16

这是因为当ASP.NET执行Control eventsASP.NET页面生命周期的一部分时,控件层次结构(特别是复选框)不存在,就像您在后续PreRender阶段创建它们一样.有关事件序列的更详细概述,请参阅ASP.NET页面生命周期概述.

我会谨慎对待@ bleeeah的建议,因为你要为CheckBox.Checked内部分配一个值rptLinkedItems_ItemDataBound,这也会导致事件处理程序执行:


chkLinked.Checked = IsItemLinked(item);
Run Code Online (Sandbox Code Playgroud)

相反,移动:


if (!Page.IsPostBack)
   {
      m_linkedItems = GetLinkedItems();
      rptLinkedItems.DataSource = GetLinkableItems();
      rptLinkedItems.ItemDataBound += new RepeaterItemEventHandler
          (rptLinkedItems_ItemDataBound);
      rptLinkedItems.DataBind();
   }

Run Code Online (Sandbox Code Playgroud)

进入Page.Load事件处理程序.


ble*_*eah 5

尝试重新订阅OnItemDataBound事件中的CheckChanged事件,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);
Run Code Online (Sandbox Code Playgroud)