【问题标题】:Handling the checkedchanged event of inner repeater Checkbox control in asp.net nested repeaters处理asp.net嵌套中继器中内部中继器复选框控件的checkedchanged事件
【发布时间】:2011-08-09 14:38:39
【问题描述】:

我在我的 aspx 页面上有嵌套的转发器。在外部转发器中,我显示产品列表,在内部转发器中,我正在显示与每个产品关联的附加选项列表。内部转发器包含一个复选框、文本框、标签和其他东西。当用户选择内部中继器中的复选框时,我想在外部中继器中找到控件。为了处理此问题,我使用以下代码。

<asp:Repeater ID="OuterRepeater" runat="server" 
        onitemdatabound="OuterRepeater_ItemDataBound" >
        <ItemTemplate>
    <asp:Label ID="CodeLabel" runat="server" Text='<%# Eval("Code") %>'></asp:Label>
     <asp:Repeater ID="InnerRepeater" runat="server" OnItemCreated="InnerRepeater_ItemCreated">
       <ItemTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true"/> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
      ......
      .......
    </ItemTemplate>
    </asp:Repeater>
     ......
      ......
    </ItemTemplate>
    </asp:Repeater>


 protected void InnerRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            RepeaterItem ri = (RepeaterItem)e.Item;

            if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem
            )
            {
                CheckBox cb = ri.FindControl("CheckBox1") as CheckBox;
                cb.CheckedChanged += new EventHandler(CheckBox1_CheckedChanged);
            }
        }

private void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {          

            CheckBox cb = (CheckBox)sender;
            if (cb.Checked)
            {
                //do something
            }
            else
            {
              //do something
            }
        }

但是由于某种原因复选框的checkedChanged事件没有触发。另外我不确定如何在内部转发器复选框控件的选中更改事件中访问外部转发器的文本框。

有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

    标签: asp.net checkbox nested repeater


    【解决方案1】:

    它不会触发 CheckedChanged 事件,因为您已将事件处理程序声明为 private,因此您必须将其设为 Protected or Public

    Protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    

    你可以像...一样访问文本框控件。

    private void CheckBox1_CheckedChanged(object sender, EventArgs e)
    { 
      CheckBox checkBox = (CheckBox)sender;
      Textbox textbox1 = (TextBox)checkBox.Parent.FindControl("TextBox1");
      String textboxText = textbox1.Text;
    }
    

    【讨论】:

    • 对不起,我应该在哪里指定检查的事件处理程序?我将 checkedchanged 事件处理程序绑定到内部中继器 itemcreated 事件中的复选框。
    • 好的,在我想之前我有一些 js 错误,所以事件没有触发。但现在即使使用“私人”修饰符也会触发。我只是想知道是否必须将其更改为“受保护” ' 因为它是在同一个文件中访问的?
    • 我也尝试使用提供的代码示例在外部中继器中找到文本框。但它不起作用。它返回 null。
    • 好的,我可以通过修改您提供的代码来访问外部中继器控件。但我仍然不确定是否必须将修饰符从“私有”更改为“受保护”。跨度>
    【解决方案2】:

    您似乎没有在标记中定义事件处理程序。

    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="CheckBox1_CheckedChanged" /> 
    

    【讨论】:

    • 正如@Muhammad 所建议的,您还需要使用 public 或 protected 。
    【解决方案3】:

    Muhammad Akhtar 今天的回答对我帮助很大! 我只需要在我的中继器中为我的动态生成的复选框设置一个特定的 ID,以恢复事件的起源,并完成其余的处理,它工作得很好。

    chkAtivo.ID = DataBinder.Eval(e.Item.DataItem, "id").ToString();
    

    已恢复为样本。 还不能投票,但谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多