【问题标题】:Add dynamic controls in ASP.NET, is there a difference between 1.1 and 2.0?ASP.NET中添加动态控件,1.1和2.0有区别吗?
【发布时间】:2010-12-15 01:29:14
【问题描述】:

我很确定在 ASP.NET 1.0/1.1 时代,在运行时创建的控件需要在Page LifecyclePage_Load 事件之前添加(即在Page_Init 内部)。

这是 Microsoft 关于它的一篇文章(适用于 .NET 1.0/1.1):
HOW TO: Dynamically Create Controls in ASP.NET:

注意创建动态控件时 在 Web 窗体上,您必须创建 控件并将它们添加到控件中 Page_Init 中的集合 事件处理程序或 Page_Load 事件 处理程序。否则,控件可能会 表现不如预期。

但是,在这里的一些帖子中,似乎不再是上述情况了。 Page_Load 中添加的控件似乎对其他人有效。部分帖子包括:
creating dynamic control in asp.net
Viewstate - utter confusion.

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

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

【问题讨论】:

    标签: asp.net page-lifecycle dynamic-controls


    【解决方案1】:

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

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

    • 默认情况下,视图状态按位置加载。也就是说,它会忽略控件 ID,并且在加载视图状态时只考虑控件在树中的位置。如果您的动态控件在视图状态被序列化时存在,但在反序列化时不存在,则错误的视图状态项可能会分配给错误的控件,从而导致异常。这可以通过一些设置来改变,虽然我现在懒得去搜索它们。
    • 由于在将动态控件添加到页面时会发生“提速”,因此某些事件的顺序可能会出乎意料。例如,如果您在 Page_PreRender 事件中将 TextBox 控件添加到页面,则 TextBox 的 Changed 事件将在此时发生。如果您的事件处理程序代码依赖于在 PreRender 之前与其余事件一起发生的事件,那么您就完蛋了。

    【讨论】:

    • @Vilx-:你的帖子是我读过的关于这个问题的更全面的帖子之一。 :)
    • 我经常处理动态添加的控件,所以我必须理解这一点。 :)
    【解决方案2】:

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

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

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

    【讨论】:

    • @Joel:很好的收获!那么这是否意味着我们应该始终在 PreInit 中创建动态控件?
    • 是的。显然,为响应按钮按下而创建的控件需要在其他地方创建。但是当重新创建回发控件时,PreInit 绝对是正确的选择。
    • @O.K.W,我们可以覆盖 CreateChildControls,也可以在这个事件中创建控件..
    • "如果您在页面加载之前添加它们,它们只会与视图状态一起使用。"它们也在 page_load 中工作。
    • @maxp:很高兴你从你的问题跳到这里。我真的很好奇这个健康的“辩论”:P
    【解决方案3】:

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

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

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

    【讨论】:

    • @Mike:天哪,我错过了。我想我选择消化我所相信的。感谢您的强调。但乔尔的回答给出了不同的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-04-19
    • 2013-09-11
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多