A meno che non sia necessario giocare con le proprietà di controllo delle impostazioni prima di tracciare ViewState, procedere personalmente e inserire la logica di aggiunta del controllo dinamico nell'evento OnInit.
Se davvero si vuole aggiungere dinamicamente un controllo durante il PreInit (quando si utilizza pagina master) si può sempre fare qualcosa di simile:
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);
}
l'accesso alla proprietà "Master" avrebbe istanziare i controlli e dovrebbe funzionare, ma ottieni scenari di pagine master annidate (this.Master.Master ...), pannelli di aggiornamento e così via.
Questo potrebbe essere pertinente e utile: http://weblogs.asp.net/ysolodkyy/archive/2007/10/09/master-page-and-preinit.aspx
Inoltre, uno dei motivi che posso pensare (oltre a seguire il ciclo di vita pagina definita) MS raccomanda che poniamo tutta la logica per la creazione di controllo dinamico in caso PreInit così abbiamo può usufruire del servizio a tema, che applicherà automaticamente tutte le proprietà skin disponibili per noi, prima che avvenga l'evento Init.
dire la vostra markup sembra qualcosa di simile:
<%@ 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>...
ed avete una pelle simile a questo:
<asp:TextBox runat="server" BackColor="Yellow" Wrap="false" Text="Skin property!" > </asp:TextBox>
Basta aggiungere questo al vostro codice dietro:
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));
}
si noterà come prima di andare in Init tutte le proprietà della pelle sono già stati applicati alla casella di testo creata dinamicamente :)