Asp.net

與在 PreInit Init 中創建和添加控制項的區別

  • January 12, 2012

網路上有大量關於 ASP.NET 生命週期的資訊,但我似乎無法弄清楚何時向頁面動態添加控制項。

一般有兩種情況;一個帶有母版頁的 aspx 頁面,一個沒有。我目前正在閱讀的書(70-515 self prep)說要在 preinit 事件處理程序中向沒有母版頁的頁面添加控制項。要動態地將控制項添加到內容頁面,我應該將該邏輯放在 init 事件處理程序中。

根據 MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) 我應該在 preinit 事件處理程序中創建或重新創建動態控制項,並且只讀取或初始化 init 事件處理程序中的控制項屬性(其中對我來說最有意義)。Google搜尋我看到很多人使用 init 事件處理程序來添加控制項。

所以,我在這裡有點迷路 - 正確的方法是什麼?並且在使用 preinit 事件處理程序時,當所有控制項都為空時,如何向頁面添加控制項?例如,當您需要將動態創建的文本框添加到面板控制項時?

親切的問候,

除非您需要在跟踪 ViewState 之前設置控制項屬性,否則我個人會繼續將動態控制項添加邏輯放在 OnInit 事件中。

如果您真的想在 PreInit 期間動態添加控制項(使用母版頁時),您可以隨時執行以下操作:

protected override void OnPreInit(EventArgs e)
{
   base.OnPreInit(e);

   TextBox textBox = new TextBox();
   textBox.Text = "Dynamic TextBox";
   textBox.Width = 100;
   textBox.ReadOnly = false;

   var master = this.Master;

   plcHolder.Controls.Add(textBox);
   textBox.ApplyStyleSheetSkin(this.Page);

}

訪問“Master”屬性將實例化控制項並且它應該可以工作,但是您會得到嵌套的母版頁場景(this.Master.Master …)、更新面板等等。

這可能是相關且有用的:http ://weblogs.asp.net/ysolodkyy/archive/2007/10/09/master-page-and-preinit.aspx

此外,我能想到的一個原因(除了遵循定義的頁面生命週期之外)MS 建議我們將動態控制項創建的所有邏輯放在 Preinit 事件中,以便我們可以利用主題服務,該服務將自動應用所有可用的皮膚屬性對我們來說,在 Init 事件發生之前。

假設您的標記看起來像這樣:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Trace="true" Inherits="_Default" Theme="Test" %>

<form id="form1" runat="server">

<div>
<p>
   <asp:TextBox ID="TextBox1" runat="server" TextMode="Password" Text="Control TextBox"></asp:TextBox>
</p>
<p>
   <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder>
</p>

</div>
</form>...

你有這樣的皮膚:

<asp:TextBox runat="server" BackColor="Yellow" Wrap="false" Text="Skin property!" > </asp:TextBox>

只需將其添加到您的程式碼後面:

private TextBox tb1;
protected override void OnPreInit(EventArgs e)
{
   base.OnPreInit(e);
   tb1 = new TextBox();
   tb1.Text = "PreInit Dynamic TextBox";

   Trace.Write(String.Format("tb1 Wrap Property-> {0}",tb1.Wrap));
   Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text));
   Trace.Write("Add tb1 to the placeholder.");
   plcHolder.Controls.Add(tb1);
   Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap));
   Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text));
}

protected override void OnInit(EventArgs e)
{
   Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap));
   Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text));
   base.OnInit(e);
}



protected void Page_Load(object sender, EventArgs e)
{
   Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap));
   Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text));

}

您會注意到在進入 Init 事件之前,所有皮膚屬性都已應用於動態創建的文本框:)

引用自:https://stackoverflow.com/questions/4761273