我做了一些与动态控件和 ViewState 相关的研究。
我读到,为了保留动态控件的 ViewState,您必须将其添加到 Page_Init 事件中。这是有道理的,因为 PageLifeCycle 是:
- 初始化。
- 加载视图状态。
- 加载回发数据。
- Load.
- 引发PostbackEvent。
- 保存视图状态。
- Render.
但我制作了一个测试应用程序,我发现即使我在 Page_Load 事件中而不是之后添加控件,ViewState 和属性值也会保留。从此我只找到了矛盾的信息。有人说控件可能会赶上 PageLifeCycle,另一些人说必须将它们添加到 Page_Init 中。有人可以帮我澄清一下吗?
我还在msdn中发现:
注意:您也许可以将控件加载到
Page_Load 事件处理程序并正确维护视图状态。它
一切都取决于您是否设置了任何属性
以编程方式动态加载控件,如果是这样,当您
相对于 Controls.Add(dynamicControl) 行执行此操作。彻底的
对此的讨论有点超出了本文的范围,但是
它可能起作用的原因是因为 Controls 属性的 Add() 方法
递归地将父级的视图状态加载到其子级中,甚至
尽管加载视图状态阶段已经过去。
但我不太明白这一点,所以我希望有人能解释一下。先感谢您。
此代码将在实际操作中演示它:
protected void Page_Load(object sender, EventArgs e)
{
Button b1 = new Button();
Button b2 = new Button();
if (!IsPostBack)
{
b1.Text = "Button1";
}
this.form1.Controls.Add(b1);
this.form1.Controls.Add(b2);
if (!IsPostBack)
{
b2.Text = "Button2";
}
}
因此,如果您在将控件添加到表单后对其进行修改,它将保留其视图状态,但如果您在将其添加到表单之前对其进行修改,则文本不会使其进入视图状态。这是what确实发生了why这就像是另一个问题(这实际上与我阅读文档时的想法相反)。
EDIT
我忘了提及 - 本质上,这是因为当通过 Controls.Add() 将控件添加到控件树时,控件会贯穿页面生命周期以“赶上”页面 - 关于此的文章有无数的文章,因为没有太多简单的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)