Repeater嵌套到Repeater中导致CheckBox.OnCheckedChanged事件意外触发

时间:2017-01-29 15:41:17

标签: c# asp.net checkbox data-binding webforms

我正在开发一个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被解雇?

提前谢谢。

0 个答案:

没有答案