除非您在跟蹤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);
}
訪問「主」屬性將實例化控制 它應該可以工作,但是您可以獲得嵌套的母版頁場景(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事件中的所有外觀屬性已經應用到動態創建的文本框:)