ASP.NET生命周期二分法:动态添加控件和事件

时间:2010-09-01 22:07:58

标签: asp.net events controls page-lifecycle pageload

情况:

  • 我的用户控件带有挂钩事件的按钮。需要在Page_Load或更早版本中初始化具有事件的控件。
  • 我希望通过单击“添加”按钮动态生成这些用户控件。
  • 重要的是要记住,只有在Page_LoadComplete之前才会触发事件,例如点击事件。

  • 破解方案A:

    1. Page_Load:动态创建一个Add按钮,钩子点击事件。
    2. 用户点击“添加”按钮,触发回发。
    3. Page_Load:照常创建“添加”按钮,并挂钩点击事件。
    4. Page_Load:不知道是否已单击“添加”按钮,因此它不知道是否会生成用户控件!
    5. AddButton_Click:页面终于意识到应在下一个Page_Load上添加新的用户控件。
    6. 用户无法看到他们添加的控件,因为已触发另一个Page_Load。
    7. 用户通过单击按钮,刷新页面等重新加载页面
    8. Page_Load:创建“添加”按钮,并挂钩单击事件。现在意识到添加了用户控件,创建了用户控件。在用户控件中挂钩事件。
    9. 用户点击用户控件中的按钮,触发就好了。
    10. 结果:用户已单击添加新用户控件,服务器知道控件应该存在,但用户在触发页面再次加载(通过单击其他按钮或刷新等)之前不会看到它)。

      当然,我看一下生命周期,看看事件后发生了Page_LoadComplete,所以如果我在Page_LoadComplete中放置任何依赖于事件的代码,那么一切都应该好吗?

      破解B:

      1. Page_LoadComplete:动态创建一个Add按钮,钩子点击事件。
      2. 用户点击“添加”按钮,触发回发。
      3. Page_LoadComplete:照常创建“添加”按钮,并挂钩点击事件。
      4. AddButton_Click:页面感知应在下一个Page_LoadComplete上添加新的用户控件。
      5. Page_LoadComplete:意识到按钮点击,动态添加控件,以及自己的内部按钮点击事件。
      6. 用户点击添加的用户控件中的按钮,但不会触发!!
      7. 结果:一切都很好,除了添加的用户控件中的按钮是惰性的。

        难题是:我需要通过按钮点击生成控件,这意味着我需要将我的Controls.Add(...)代码放在Page_LoadComplete中。相反,我需要添加控件来处理工作事件,这意味着Controls.Add(...)代码需要在Page_Load中。我有一个完美的二分法。

        我能想到的唯一可行的解​​决方案是在单击“添加”按钮后,使用解决方案A并强制页面手动重新加载,这会浪费带宽和处理。

    1 个答案:

    答案 0 :(得分:0)

    这可能不是最佳做法,但您可以在Page_Init事件期间检查Request.Form是否有添加按钮点击的证据,并在那里添加控件。它应该可以解决你的问题。