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

StackOverflow https://stackoverflow.com/questions/1404528

  •  05-07-2019
  •  | 
  •  

我有一个转发器,在转发器的每个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>

该集合与转发器绑定如下:

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);
}

P.S。如果有人也可以告诉我为什么降价对我不起作用......

有帮助吗?

解决方案

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

我会谨慎对待@ 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 事件处理程序。

其他提示

尝试使用 AutoPostBack =&quot; true&quot; ,如下所示:

<asp:CheckBox ID="chkLinked" runat="server" Checked="false"
    OnCheckedChanged="chkLinked_CheckedChanged" AutoPostBack="true"/>

尝试重新订阅ItemDataBound事件中的CheckedChanged事件,

chkLinked.CheckedChanged += new EventHandler(chkLinked_CheckedChanged);

使用 AutoPostBack =&quot; true&quot; ,如下所示:

<asp:CheckBox ID="chkLinked" runat="server" AutoPostBack="true"
    Checked="false" OnCheckedChanged="chkLinked_CheckedChanged" />

订阅Page_Init中的CheckChanged事件。

您必须在repeater item命令中为checklist定义eventhandler,然后在repeater item命令中,检查清单项并获取检查项。

在.aspx页面中,您可以使用Ajax和updatepanel来触发事件处理程序,但请记住,您必须在转发器之外定义脚本管理。

// checklisk checkedchange eventhandler

protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
        {
        }

和item repeater命令项: //迭代核对表项并检测已检查的

    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] + ",";
            }
        }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top