3

我很确定在 ASP.NET 1.0/1.1 时代,在运行时创建的控件需要在页面生命周期Page_Load事件之前添加(即 inside )。Page_Init

这是 Microsoft 的一篇文章(适用于 .NET 1.0/1.1):
如何:在 ASP.NET 中动态创建控件

注意 在 Web 窗体上创建动态控件时,必须创建控件并将它们添加到 Page_Init 事件处理程序或 Page_Load 事件处理程序中的控件集合中。否则,控件可能无法按预期运行。

但是,在这里的一些帖子中,似乎不再是上述情况了。在其中添加的控件Page_Load似乎对其他人有用。一些帖子包括:
在 asp.net Viewstate 中创建动态控件
- 完全混乱。

我自己试过了,虽然我没有做足够的测试来找出任何意外的行为,但它确实有效。

那么Page_Load添加动态控件是一个安全的阶段吗?还是仅适用于 .NET 2.0 及更高版本?

4

3 回答 3

3

我已经用 Reflector 研究过这个,当你动态添加它们时,Control 类确实可以加快速度,无论你何时添加它们。它做所有事情——加载视图状态/控制状态、调用回发事件、调用事件处理程序等。我不知道它在 ASP.NET 1.x 天是否有所不同,但在 2.0 及更高版本中就是这种情况。

至于“危险” - 有一些没有经验的用户可能会绊倒,因此建议您在 Page_Init 或之前添加它们。(请注意,PreInit 事件仅适用于页面本身,而不适用于母版页或子控件)。在我的脑海中(我相信可能还有更多):

  • 默认情况下,视图状态按位置加载。也就是说,它会忽略控件 ID,并且在加载视图状态时只考虑控件在树中的位置。如果您的动态控件在视图状态被序列化时存在,但在反序列化时不存在,则错误的视图状态项可能会分配给错误的控件,从而导致异常。这可以通过一些设置来改变,虽然我现在懒得去搜索它们。
  • Since the "bringing up to speed" happens when the dynamic control gets added to the page, the order of some events might be unexpected. For example, if you add a TextBox control to the page in the Page_PreRender event, the Changed event of the TextBox will happen there and then. If your event handler code depends on the event happening with the rest of them before PreRender, then you are screwed.
于 2009-11-10T15:12:51.317 回答
2

您可以随时添加控件。但是,如果您在页面加载之前添加它们,它们只会与视图状态一起使用。

事实上,如果您查看您发布的页面生命周期链接的 .Net 2.0 版本,您仍然会在 PreInit 事件下找到此引用:

将此事件用于以下目的: ... 创建或重新创建动态控件。

于 2009-11-10T14:18:40.830 回答
1

Page_Load 事件处理程序是添加控件的可接受位置。如果你重新阅读你的笔记,你会注意到他们说的。

注意:在 Web 窗体上创建动态控件时,必须创建控件并将它们添加到 Page_Init 事件处理程序或 Page_Load 事件处理程序中的控件集合中。否则,控件可能无法按预期运行。

如果您链接到的 ASP.NET 2.0 文章,在“添加控件的赶上事件”下,他们讨论了如何使添加的控件与页面同步。

于 2009-11-10T14:27:35.447 回答