与在中继器内激发复选框的CheckedChange事件有关的问题

本文关键字:CheckedChange 事件 问题 复选框 中继器 | 更新日期: 2023-09-27 18:00:22

我有一个asp.net应用程序,我在用户控制中添加了中继器,在中继器内部我添加了asp Checkbox

<asp:Repeater ID="Repeater1" runat="server" 
    onitemdatabound="Repeater1_ItemDataBound" 
    onitemcommand="Repeater1_ItemCommand" >
    <ItemTemplate>
        <table>
            <tr>
                <td>    
                     <asp:CheckBox runat="server" ID="chkSelect" AutoPostBack="true" Visible="false" OnCheckedChanged="chkSelect_CheckedChanged" />
                </td>

和在CodeBehind文件中:

 protected void chkSelect_CheckedChanged(object sender, EventArgs e)
        {
            string s = "";
        }

但单击复选框时不会触发事件。

我还尝试在中继器控件的itemDataBound事件触发时动态添加事件:

<asp:Repeater ID="Repeater1" runat="server" 
    onitemdatabound="Repeater1_ItemDataBound" 
    onitemcommand="Repeater1_ItemCommand" >
    <ItemTemplate>
        <table>
            <tr>
                <td>    
                     <asp:CheckBox runat="server" ID="chkSelect" AutoPostBack="true" Visible="false" />
                </td>

在代码背后:

   protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (((DataRowView)e.Item.DataItem).Row["DataType"].ToString().Trim().Equals("bool"))
            {
                CheckBox chkSelect = (CheckBox)e.Item.FindControl("chkSelect");
                chkSelect.CheckedChanged += new EventHandler(chkSelect_CheckedChanged);
                chkSelect.Visible = true;
            }

但事件仍然没有启动。。

如何调用Repeater控件内部的CheckBox控件的事件。。。

与在中继器内激发复选框的CheckedChange事件有关的问题

如果将事件连接到ItemCreated事件而不是ItemDataBound事件中,则可能会触发该事件:

protected void Repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
   {
       CheckBox chkSelect = (CheckBox)e.Item.FindControl("chkSelect");
       if(chkSelect != null)
       {
            chkSelect.CheckedChanged += new EventHandler(chkSelect_CheckedChanged);
            chkSelect.Visible = true;
       }
   }

原因可能是ItemDataBound只在数据绑定时触发。因此,当您返回时,您的Repeater是从ViewState重建的,并且对每一行执行ItemCreated,但ItemDataBound不是。

只需反转逻辑即可。

使用CheckedChanged处理程序创建默认可见的CheckBox

<asp:Repeater ID="Repeater1" runat="server" 
    onitemdatabound="Repeater1_ItemDataBound" 
    onitemcommand="Repeater1_ItemCommand" >
    <ItemTemplate>
        <table>
            <tr>
                <td>    
                     <asp:CheckBox runat="server" ID="chkSelect" AutoPostBack="true" OnCheckedChanged="chkSelect_CheckedChanged" />
                </td>

ItemDataBound事件中,为那些不想显示的设置Visible=false

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (!((DataRowView)e.Item.DataItem).Row["DataType"].ToString().Trim().Equals("bool"))
    {
        CheckBox chkSelect = (CheckBox)e.Item.FindControl("chkSelect");
        chkSelect.Visible = false;
    }
}