我正在构建一个页面,其中包含页面上静态的一些组件(下拉列表,按钮,用于保存它们的表格),但是一个表格单元格填充了可变生成的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当前为空,在用户点击按钮之前不会运行任何内容。
答案 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;
}