C# DataBound ASP:复选框事件未按预期触发,因为在页面_Load()上发生数据绑定

C# DataBound ASP:复选框事件未按预期触发,因为在页面_Load()上发生数据绑定,c#,asp.net,checkbox,page-lifecycle,C#,Asp.net,Checkbox,Page Lifecycle,我陷入了一个ASP页面 该页面包含一个ASP:容器,其中包含多个复选框。 我需要在这些复选框上添加一个事件OnCheckChange,这样每当我们单击其中一个复选框时,它就会取消选中所有其他复选框。 我可以使用单选按钮,但使用复选框对我来说还有其他优势,这些优势不属于本主题,所以我不想使用单选按钮 从理论上讲,这样做很好: <ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBou

我陷入了一个ASP页面

该页面包含一个ASP:容器,其中包含多个复选框。 我需要在这些复选框上添加一个事件OnCheckChange,这样每当我们单击其中一个复选框时,它就会取消选中所有其他复选框。 我可以使用单选按钮,但使用复选框对我来说还有其他优势,这些优势不属于本主题,所以我不想使用单选按钮

从理论上讲,这样做很好:

<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();
        }
    }
这会导致一切失败!:) 因为当我点击复选框时,它会在MyCB_CheckedChanged()之前触发页面加载。Si it首先进行数据绑定,因此,数据绑定会发送一些复选框事件,这些事件不是由用户执行的

有没有办法解决这个问题


提前使用Thx。

如果可能的话,尝试在页面生命周期的后期绑定数据源(例如onPreRender)。复选框的控件事件在PageLoad之后、PreRender之前和其他一些事件之前处理。有关详细信息,请参阅。

1。是否确定每次加载页面时都需要重新绑定数据库?这有点不寻常——如果你愿意解释一下你的理由,可能会帮助其他人更好地理解。@Sandy:我想,因为姿势中提到的容器嵌套在另一个容器中。如果我没有在回发时重新绑定主容器,我会注意到所有子容器都没有数据。我应该提到容器嵌套在另一个容器中。这是父容器,需要重新启动,以便在回发时显示复选框。所以,如果我将绑定移动到PreRender中,结果也是一样的:如果我不重新绑定父容器,它的数据源将重置,没有子容器,因此没有MyCB_CheckedChanged方法触发器。如果I only bind on PostBack=false,当选中一个框时,页面将重新加载,父容器不会重新绑定,并且没有子容器。所有复选框消失,并且再次没有MyCB_CheckedChanged事件触发器…除了页面的PreRender事件外,大多数容器上也有PreRender事件。您是否已尝试在其自己的PreRender事件上重新绑定父容器,并在其PreRender事件上单独重新绑定子容器。这样,子容器应该查看最新的父容器,这正是您想要的。另外,如果您发布一个小的源代码示例来说明这个问题,也会很好。对我们其他人来说,更好地了解你在做什么很有帮助。:)桑迪,我还是没能让它工作,但我设法向前迈进了一步。由于最新的发现超出了这篇文章的范围,我在这里更新了一篇文章:我在这次更新中编写了更详细的代码。如果你有时间看一看,我很想听听你对这篇更新文章的看法:)
 protected void Page_Load(object sender, EventArgs e)
    {
     //   if (!IsPostBack)
        {
            MyRepeater.DataSource=DS;
            MyRepeater.DataBind();
        }
    }