我的作品中有一个嵌套转发器。我有责任在每个转发器项目下面添加asp:复选框,以便我们可以通过复选框控制每个项目。
标记代码为:
<ItemTemplate>
<li class="<%# GetCategoryClass(Container.DataItem) %> cl-li">
<asp:CheckBox runat="server" ID="checkBox" AutoPostBack="true" OnCheckedChanged="CheckedChanged" />
<a class="cl-a excludeLink" visible='<%# GetCategoryClass(Container.DataItem) == "DISPLAYED" %>' href="<%# GetExcludeCategoryCommand(Container.DataItem) %>" runat="server" id="butExclude">x</a>
<a class="cl-a" href="<%# GetCategoryCommand(Container.DataItem) %>" runat="server" id="butCategory"><%# GetCategoryTitle(Container.DataItem, true) %></a>
</li>
</ItemTemplate>
c#代码是:
protected void CheckedChanged(object obj, EventArgs e)
{
// some works
}
我开始研究这个问题并发现CheckedChanged函数没有通过调试触发。但是,当我在
中添加一行时if(IsPostBack){
CheckedChanged(sender, e); //add
}
它在我调试时工作并进入CheckedChanged函数。 我读了很多文章,没有人说我需要在IsPostBack块中添加该行。有没有人能告诉我原理?
答案 0 :(得分:4)
您的代码应该有效。这取决于你如何写它。
我做了一个有效的例子:
Default.aspx :
<table>
<asp:Repeater ID="RepeaterCB" runat="server">
<ItemTemplate>
<tr>
<td><%# Container.DataItem %></td>
<td><asp:CheckBox runat="server" OnCheckedChanged="OnCheckedChange" AutoPostBack="true"/></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
Default.aspx.cs :
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
RepeaterCB.DataSource = new List<string> { "tom", "fred", "pijule" };
RepeaterCB.DataBind();
}
}
protected void OnCheckedChange(object sender, EventArgs e)
{
Response.Write("<script>alert('Fire');</script>");
}
每次检查或取消选中文本框时,此代码都会触发警报。
希望它有所帮助。