【问题标题】:Create Dynamic Controls in PreInit Event of Page Life Cycle?在页面生命周期的 PreInit 事件中创建动态控件?
【发布时间】:2012-03-30 23:14:08
【问题描述】:

MSDN 说在页面生命周期的 PreInit 事件中创建动态控件。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

为什么?

在 PreInit Event 中创建有什么好处?

我见过开发人员在 Page_Load 方法中创建动态控件的代码?

如果有什么不同呢?

问候

【问题讨论】:

标签: asp.net


【解决方案1】:

Page_Load 工作正常,如果您不需要担心在回发中保存控件的ViewState,但如果您需要持久保存它,Load 阶段不是您应该添加这些控件的地方。

在加载 ViewState 之前,动态控件必须存在于页面的控件层次结构中。在加载视图状态之前只有一个阶段 - 初始化。这意味着,如果您希望动态控件保持视图状态,则必须将它们添加到页面的Init 事件中的控件层次结构中。

http://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx

但请注意,您无法在 Init 事件中访问 ViewState,因为它尚未加载。因此,如果需要,您需要使用不同的持久性介质来跨回发(如 Session)存储变量。

【讨论】:

  • 我不明白您所说的“如果您希望动态控件保持视图状态,则必须将它们添加到页面的 Init 事件中的控件层次结构中”是什么意思。我遇到了一个问题,我需要在创建子动态控件后访问它们的 ViewState 以保持要在回发中使用的值,并且我可以在设置它们的父级后在页面Load 事件中使用它们的 ViewState。我错过了什么?
  • Here 我刚才提到的例子。
【解决方案2】:

这个回复对于原始海报可能会迟到,但我认为它可能会帮助其他人。

如果您的应用程序/网站不使用母版页,最好在 Page_PreInit 事件中创建控件。但是如果您使用母版页并希望在运行时在内容页上创建控件,Page_Init 是理想的事件。

您也可以在 Page_Load 上创建控件,但请记住页面加载是在加载视图状态后触发的。

【讨论】:

    【解决方案3】:

    蒂姆, 谢谢回复。 我做了一个小实验,在 Page_Load 方法中动态创建和添加 TextBox 控件。

    在页面上Button的回发点击事件中,我试图获取TextBox的Text属性的值。 当控件在 Page_Load 事件中而不是 OnPreInt 方法中动态添加时,我能够在 Button 的单击事件中获取值。 我认为即使在 Page_Load 方法中添加了控件,Text 值也会保留在 ViewState 中。

    按照代码:

      <div>
             <p>
               <asp:Label ID="lbl" runat="server" />
            </p>
            <p>
              <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder>
            </p>
            <p>
              <asp:Button ID="btn" runat="server" Text="Click" OnClick="btn_Click" />
            </p>
        </div>
    
    
    private void _createTextBox()
    {
        TextBox textBox = new TextBox();
        textBox.ID = "txtBox";
        textBox.Width = 250;
        textBox.ReadOnly = false;
        plcHolder.Controls.Add(textBox);
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        _createTextBox();
        if (!this.IsPostBack)
        {
            Control ctrl = plcHolder.FindControl("txtBox");
            if (ctrl != null)
            {
                TextBox txtBox = ctrl as TextBox;
                txtBox.Text = DateTime.Now.ToString();
            }
        }
    }
    protected void btn_Click(object sender, EventArgs e)
    {
        Control ctrl = plcHolder.FindControl("txtBox");
        if (ctrl != null)
        {
            TextBox txtBox = ctrl as TextBox;
            lbl.Text = txtBox.Text;
        }
    }
    

    请让我知道这是正确的还是我做错了什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2023-03-18
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多