与在中继器内激发复选框的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控件的事件。。。
如果将事件连接到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;
}
}