0

情况:

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

  • 破碎的解决方案A:

    1. Page_Load:动态创建一个Add按钮,hook点击事件。
    2. 用户点击添加按钮,触发回发。
    3. Page_Load:像往常一样创建添加按钮,并挂钩单击事件。
    4. Page_Load:不知道 Add 按钮已经被点击,所以它不知道生成用户控件!
    5. AddButton_Click:Page 终于意识到应该在下一个 Page_Load 时添加一个新的用户控件。
    6. 用户看不到他们添加的控件,因为另一个 Page_Load 已被触发。
    7. 用户通过单击按钮、刷新页面等方式重新加载页面。
    8. Page_Load:创建添加按钮,并挂钩单击事件。现在知道添加的用户控件,创建用户控件。挂钩用户控件中的事件。
    9. 用户点击用户控件中的按钮,触发就好了。

    结果:用户已单击添加新用户控件,服务器知道该控件应该存在,但用户在触发页面再次加载(通过单击另一个按钮或刷新等)之前看不到它。

    当然,我查看了生命周期,发现 Page_LoadComplete 发生在事件之后,所以如果我在 Page_LoadComplete 中放置任何与事件相关的代码,应该一切都好吗?

    破碎的解决方案 B:

    1. Page_LoadComplete:动态创建一个Add按钮,hook点击事件。
    2. 用户点击添加按钮,触发回发。
    3. Page_LoadComplete:像往常一样创建添加按钮,并挂钩单击事件。
    4. AddButton_Click:页面意识到应该在下一个 Page_LoadComplete 时添加一个新的用户控件。
    5. Page_LoadComplete:感知按钮点击,动态添加控件,自带内部按钮点击事件。
    6. 用户单击添加的用户控件中的按钮,但没有触发!

    结果:一切都很好,除了添加的用户控件中的按钮是惰性的。

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

    我能想到的唯一 janky 解决方案是采用解决方案 A 并在单击 Add 按钮后强制页面手动重新加载,这是对带宽和处理的浪费。

    4

    1 回答 1

    0

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

    于 2010-09-01T23:18:45.297 回答