Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消选中复选框时,不会激发asp:checkbox的OnCheckedChanged事件处理程序_C#_Asp.net_C# 2.0 - Fatal编程技术网

C# 取消选中复选框时,不会激发asp:checkbox的OnCheckedChanged事件处理程序

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">

我有一个repeater,在repeater的每个ItemTemplate中都有一个asp:checkbox和一个OnCheckedChanged事件处理程序集。复选框的AutoPostBack属性设置为true。选中任何复选框时,事件处理程序将激发。如果未选中“任何”,则不会触发事件处理程序

你知道为什么这场比赛没有打响吗?我是如何让它打响的?谢谢

简化中继器代码:

<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在您更改复选框的状态后刷新页面,因此您可以正确处理属性复选框。