【问题标题】:How to prevent AutoPostBack from resetting my page?如何防止 AutoPostBack 重置我的页面?
【发布时间】:2016-07-04 05:58:11
【问题描述】:

我正在构建一个页面,其中包含页面上的一些静态组件(下拉菜单、按钮、用于保存它们的表格),但一个表格单元格中填充了可变生成的复选框。当按下按钮时,页面代码会计算要放置哪些复选框,并为每个需要的复选框创建一个新的 CheckBox 对象,然后将其添加到页面上的现有 Div。

我正在尝试在选中或取消选中其中任何一个时触发一些代码运行,但 checkBoxName.CheckedChanged += cbCheckedChanged 不起作用。我研究并发现了两个建议:启用视图状态和启用自动回发。

checkBoxName.EnableViewState = true; 似乎没有任何区别,checkBoxName.ViewStateMode = ViewStateMode.Enabled; 或我尝试过的任何变化也没有。 checkBoxName.AutoPostBack = true; 做了一些事情,但它不允许它运行我想要的代码。我认为那是因为下一个问题,它没有达到那个点:

使用AutoPostBack = true,每当我选中或取消选中一个框时,cbCheckedChanged 都不会被执行,整个页面正在重新加载,重置为初始状态,因此从表格中完全删除了复选框。

我该如何解决这些问题,或者至少我可以从哪里开始寻找?

编辑:

这是创建复选框的地方:

CheckBox cb = new CheckBox();
cb.Text = CBName;
cb.EnableViewState = true;
cb.ViewStateMode = ViewStateMode.Enabled;
cb.AutoPostBack = true;
cb.CheckedChanged += CBCheckedChanged;

这就是 CBCheckedChanged 所在的位置:

private void CBCheckedChanged(object sender, EventArgs e)
{
\\Stuff
}

当我使用断点单步执行它时,它永远不会到达 CBCheckedChanged。我已经尝试了在 AutoPostBack、ViewStateMode 和 EnableViewState 行中注释和离开的所有可能组合。

Page_Load 当前为空,在用户点击按钮之前不会运行任何内容。

【问题讨论】:

  • 您确定同时使用 checkBoxName.CheckedChanged += cbCheckedChanged 和 AutoPostBack = true 吗?如果您在 page_load 事件中设置断点并在选中复选框后单步执行,它不会进入您的事件处理程序?
  • 使用回发时,您需要将 Page_Load 事件处理程序中的代码封装在 If Not IsPostBack Then ... 中,以确保此初始化代码仅在页面第一次加载时运行。
  • 除非您重新创建了所有控件,否则该事件将不会执行,并且如果您希望部分更新使用 UpdatePanel,则帖子将始终在发送新页面时重建您的页面。
  • 你能发布你想要开始工作的标记和代码吗?
  • @Gusman,我不知道从哪里开始,我是否将要放入复选框的 div 放在更新面板中?我只是把其他所有东西合二为一吗?复选框本身?我想要的是页面的内容不会改变,除了一个复选框被选中,而是触发 CBCheckedChanged 的​​运行

标签: c# asp.net checkbox


【解决方案1】:

ViewState 默认为服务器端控件启用。您不必修补 ViewState 来解决您的问题。 ViewState 基本上用于在回发发生后恢复控件的状态。例如,将所有条目读取到ListBox 控件。这就是为什么大多数控制人口代码都在Page_Load 方法中的这种结构中。

private void Page_Load()
{
    if (!Page.IsPostBack)
    {
        // populate controls here
    }
}

ViewState 是一个非常容易被误解的概念。有一个great article here 详细介绍了它。但正如我所说,对于您的问题,ViewState 不是问题。

解决您的问题:

您的情况的问题是触发按钮正在创建CheckBox控件,但是当页面重新加载时,由于这些控件的CheckedChanged事件,下一页生命周期没有@的线索987654327@ 在前一个页面生命周期中放置在页面上的控件。需要为每个页面生命周期生成动态控件!

所以我要做的是创建一个方法:

  • 创建CheckBox 控件和
  • 为他们设置AutoPostback = true
  • CheckedChanged设置事件处理程序

让我们将此方法称为AddDynamicCheckBoxes()。现在您需要在按钮已被按下时在您的PagePage_Load 事件中调用此方法,并且还需要在按钮的单击事件的事件处理程序中调用此方法。你可以这样做:

private void Page_Load()
{
    if (ViewState["button_was_clicked"] != null)
    {
        AddDynamicCheckBoxes();
    }
}

private void Button_OnClick()
{
    AddDynamicCheckBoxes();
    ViewState["button_was_clicked"] = true;
}

【讨论】:

  • 赞成理解这个棘手的东西并给出一个很好的解释
  • 这确实解决了页面重置的问题......所以谢谢你......不幸的是,由于某种原因我仍然没有触发 CheckedChanged。
  • 更新:它有效!我不知道确切的问题,但显然它与我试图意外分配 CheckBoxes 非唯一 ID 有关?不知道为什么会发生这种情况,或者为什么之前没有给出错误,或者为什么会导致这个特定问题,但是当我在选中一个框后尝试刷新页面时遇到错误,说一些关于非唯一 ID 的内容,并评论取出分配了 id 的部分,整个事情就开始工作了。
  • 很高兴我能帮上忙。
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2010-12-14
  • 2015-06-17
  • 2019-02-20
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多