在Page_Init之后动态添加来自事件的控件

时间:2010-05-14 15:01:40

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

可能看起来像一个愚蠢的标题,因为如果你想维护ViewState,你不应该在Page_Init之后添加动态控件,但我想不出更好的解释问题的方法。

我有一个类似于以下的类:

public class WebCustomForm : WebControl, IScriptControl
{
    internal CustomRender Content
    {
        get
        {
            object content = this.Page.Session[this.SESSION_CONTENT_TRACKER];
            return content as CustomRender;
        }
        private set
        {
            this.Page.Session[this.SESSION_CONTENT_TRACKER] = value;
        }
    }
}

CustomRender是一个抽象类,它实现了ITemplate,我用它来自我包含我正在编写的CustomForms模块。

在包含Page_Init的页面的WebCustomForm上,我通过将相关ID传递给它来初始化控件。然后在OnInit的重写WebCustomForm方法上,我调用当前处于活动状态的CustomRender控件上的实例化:

if (this.Content != null)
{
     this.Content.InstantiateIn(this);
}

问题是我的CustomRender控件需要能够更改CustomRender的{​​{1}}控件。但是当触发CustomRender的事件发生时,Page_Init事件显然已经消失了。所以,我的问题是,如何从动态添加的控件中更改WebCustomForm的内容?

我看到它的方式,我有三个选择:

  1. 我将WebCustomForm控件分开 独自站出来 控制,基本上有一个aspx 每个控件的页面和处理 我自己在页面上的事件(虽然 我希望能够控制一下 我放在页面上忘记了)
  2. 我不使用事件而只是保持 请求当前页面,但是 使用不同的请求参数
  3. 我带着回到绘图板 任何人都可以提出更好的建 给我。

2 个答案:

答案 0 :(得分:0)

为什么不在InitComplete事件上执行此操作。这是在页面初始化之后但在状态加载之前。

答案 1 :(得分:0)

我选择了1.我取消了整个控件,只是创建了需要坐在不同页面上的单独控件。我添加了属性以获取Postback Urls并创建了Session属性,以便在控件之间传递ID,因此我不必依赖RequestParams。