Jeśli nie musisz bawić się ustawianiem właściwości kontrolnych przed śledzeniem elementu ViewState, osobiście dodam moją logikę dodawania dynamicznej kontroli do zdarzenia OnInit.
Jeśli naprawdę chcesz, aby dynamicznie dodać kontrolę podczas PreInit (przy wykorzystaniu strony wzorcowej) zawsze można zrobić coś takiego:
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);
}
dostępu „Master” własność będzie instancji kontroli i powinno działać, ale dostajesz scenariusze zagnieżdżonych stron głównych (this.Master.Master ...), panele aktualizacji i tak dalej.
To może być istotne i pomocne: http://weblogs.asp.net/ysolodkyy/archive/2007/10/09/master-page-and-preinit.aspx
Ponadto, jednym z powodów mogę myśleć (oprócz po określonej stronie cyklu) MS zaleca kładziemy całą logikę do dynamicznego tworzenia kontrolnej w przypadku Preinit więc może skorzystać z usługi kompozycji, która automatycznie zastosuje dla nas wszystkie dostępne właściwości skóry, zanim nastąpi inicjacja Init.
Wypowiedz znaczników wygląda mniej więcej tak:
<%@ 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>...
i masz skórę tak:
<asp:TextBox runat="server" BackColor="Yellow" Wrap="false" Text="Skin property!" > </asp:TextBox>
Wystarczy dodać do tego kodu za:
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));
}
można zauważyć, jak przed pójściem do zdarzenia Init wszystkie właściwości skóry są już zastosowane do dynamicznie tworzonego pola tekstowego :)