【问题标题】:DataBound ASP:CheckBox events not triggering as expected bacause of DataBinding occuring on Page_Load()DataBound ASP:CheckBox 事件未按预期触发,因为 Page_Load() 上发生 DataBinding
【发布时间】: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


【解决方案1】:

如果可能,请尝试在页面生命周期的后期绑定您的数据源(例如 onPreRender)。复选框的控制事件在 PageLoad 之后和 PreRender 以及其他一些事件之前处理。详情请见https://msdn.microsoft.com/en-us/library/ms178472.aspx

【讨论】:

  • 我应该提到容器嵌套在另一个容器中。那是需要重新绑定才能在 PostBack 上显示复选框的父容器。如果我将绑定移动到 PreRender 中,结果相同:如果我不重新绑定我的父亲容器,它的数据源会重置,没有子容器,所以没有 MyCB_CheckedChanged 方法触发。如果我仅在回发= false上绑定,则在选中一个框时,页面重新加载,父亲容器不会重新固定,没有孩子。所有复选框都消失了,没有 MyCB_CheckedChanged 事件触发......
  • 除了页面的 PreRender 事件之外,大多数单独的容器上也有 PreRender 事件。您是否尝试过在其自己的 PreRender 事件上重新绑定父容器,以及在其 PreRender 事件上单独重新绑定子容器。这样,子容器应该查看最新的父容器,这就是您想要的。
  • 另外,如果您发布一个源代码的小示例来说明问题,那就太好了。这有助于我们其他人更好地了解您在做什么。 :)
  • 桑迪,我仍然没有设法让它工作,但我设法向前迈出了一步。由于最新发现超出了本文的范围,因此我在此处更新了帖子:stackoverflow.com/questions/41922676/… 我在此更新中编写了更详细的代码。如果您有时间看一下,我很想听听您对这篇更新后的帖子的看法:)
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多