【发布时间】:2017-01-22 22:43:32
【问题描述】:
我被困在一个 ASP 页面中。
该页面包含一个 ASP:Container,其中包含多个 CheckBox。 我需要在这些 CheckBoxes OnCheckChange 上添加一个事件,因此每当我们单击其中一个 CheckBoxes 时,它都会取消选中所有其他复选框。 我可以使用 RadioButton,但使用 CheckBoxes 对我来说还有其他优势,这些优势不在本主题范围内,所以我不想使用单选按钮。
理论上这样可以正常工作:
<ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound">
<ItemTemplate>
<asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" />
<br/>
</ItemTemplate>
</ASP:Repeater>
进入后面的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MyRepeater.DataSource=DS;
MyRepeater.DataBind();
}
}
protected void MyCB_CheckedChanged(object sender, EventArgs e)
{
UncheckallOtherCheckBoxes();
}
但是,要让此页面的其他区域按预期工作,我必须在每次页面加载时绑定 DataSource,而不仅仅是第一次。 所以我需要将 Page_Load 更改为
protected void Page_Load(object sender, EventArgs e)
{
// if (!IsPostBack)
{
MyRepeater.DataSource=DS;
MyRepeater.DataBind();
}
}
这会导致一切都失败! :) 因为当我点击一个复选框时,它会在 MyCB_CheckedChanged() 之前触发 Page_Load。首先是 DataBinds,因此,数据绑定会发送一些不是用户执行的复选框事件。
有办法解决吗???
提前致谢。
【问题讨论】:
-
1.您确定每次加载页面时都需要重新绑定数据库吗?这有点不寻常——如果你愿意解释你的原因,它可能会帮助其他人更好地理解。
-
@Sandy:我认为,因为姿势中提到的容器嵌套在另一个容器中。如果我不在 PostBack 上重新绑定主容器,我注意到所有子容器都没有数据。
标签: c# asp.net checkbox page-lifecycle