如何防止AutoPostBack重置我的页面?

时间:2016-03-17 17:50:49

标签: c# asp.net checkbox

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

我试图在检查或取消选中任何代码时触发某些代码,但checkBoxName.CheckedChanged += cbCheckedChanged无效。我研究并发现了两个建议:启用viewstate并启用autopostback。

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

使用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当前为空,在用户点击按钮之前不会运行任何内容。

1 个答案:

答案 0 :(得分:3)

默认情况下,为服务器端控件启用

ViewState 。您不必修改ViewState来解决您的问题。 ViewState主要用于在回发发生后恢复控件的状态。例如,读取ListBox控件的所有条目。这就是为什么大多数控制人口代码都在Page_Load方法中的这种构造中。

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

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

解决您的问题:

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

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

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

我们称这个方法为AddDynamicCheckBoxes()。现在,您需要在按下按钮时Page_Load Page事件中调用此方法,并且还需要在按钮的click事件的事件处理程序中调用此方法。你可以这样做:

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

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