我正在开发一个ASP WebForm。
该页面包含父亲ASP:Repeater。此Repeater的子项本身包含一个包含CheckBoxes集合的Repeater。我需要在这些CheckBoxes OnCheckChange上添加一个事件,所以每当我们单击其中一个CheckBox时,它都会取消选中所有其他复选框。我可以使用RadioButton,但使用CheckBoxes对我来说还有其他优点,因此我不想使用单选按钮。
理论上这可以正常工作:
<asp:Repeater ID="FatherContainer" runat="server" OnItemDataBound="On_FatherContainer_ItemDataBound">
<ItemTemplate>
...
<ASP:Repeater id="ChildRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound">
<ItemTemplate>
<asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" />
</ItemTemplate>
</ASP:Repeater>
</ItemTemplate>
</ASP:Repeater>
我想要的是,当我点击CB时,会触发以下方法:
protected void MyCB_CheckedChanged(object sender, EventArgs e)
{
UncheckallOtherCheckBoxes();
}
我必须遇到一些导致所有情况无效的绑定问题。
如果我在第一次加载时将我的FatherContainer数据绑定到Page_Load:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MyRepeater.DataSource = DS;
MyRepeater.DataBind();
}
}
首次加载时数据绑定正常,我可以看到所有我心爱的复选框。 但是,当我单击任何CheckBox,页面重新加载时,FatherContainer不会重新绑定,复选框不再存在,并且它们的事件方法永远不会触发。
所以我认为我必须在每个页面上加载DataBind:
protected void Page_Load(object sender, EventArgs e)
{
// if (!IsPostBack)
{
MyRepeater.DataSource = DS;
MyRepeater.DataBind();
}
}
如果我这样做,我会得到一些意想不到的结果。
假设我的第一个ItemTemplate包含3个CheckBoxes。
首次加载时,一切都很好。
如果我点击第二个CB,它会重新加载,FatherContainer重新绑定到Page_Load,然后使用sender =我的第二个CB触发MyCB_CheckedChanged。到目前为止这是正常的。
现在如果我点击第三个CB,页面再次重新加载,FatherContainer再次重新绑定。 MyCB_CheckedChanged被解雇了两次!第一次与SENDER = SECOND CB再次!!第二次获得第三届CB。
如果我再次单击CB2,则在页面重新加载时,MyCB_CheckedChanged将使用sender = CB3(而不是CB2)触发。
当CB状态改变但在Page_Load之后检查CB时,看起来MyCB_CheckedChanged不会触发。
我尝试将数据绑定到Page_Init中:相同的结果。
如果我将数据绑定到OnPreRender,MyCB_CheckedChanged永远不会被触发!!
那么我应该怎么做才能让MyCB_CheckedChanged仅针对刚检查或未选中的CB被解雇?
提前谢谢。