與在 PreInit Init 中創建和添加控制項的區別
網路上有大量關於 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 事件之前,所有皮膚屬性都已應用於動態創建的文本框:)