【问题标题】:Dynamically adding controls from an Event after Page_Init在 Page_Init 之后从事件中动态添加控件
【发布时间】:2010-05-14 15:01:40
【问题描述】:

如果你想维护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 模块。

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

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

问题是我的CustomRender 控件需要能够更改WebCustomFormCustomRender 控件。但是当在 CustomRender 上触发的事件触发时,Page_Init 事件显然已经消失了。所以,我的问题是,如何通过动态添加的控件更改WebCustomForm 的内容?

在我看来,我有三个选择:

  1. 我将CustomRender 控件分开 出入自己的独立 控制和基本上有一个aspx 每个控件的页面并处理 我自己在页面上的事件(虽然 我希望只是做一个控制 我掉在页面上忘记了)
  2. 我不使用事件,只保留 请求当前页面,但是 使用不同的请求参数
  3. 我回到绘图板 任何人都可以提出更好的建议 给我。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 因为我的事件将在 InitComplete 事件之后触发。
    【解决方案2】:

    我选择了选项 1。我取消了整体控制,只是创建了需要放在不同页面上的单独控件。我添加了属性以获取回发 URL,并创建了用于在控件之间传递 ID 的会话属性,因此我不必依赖 RequestParams。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多