2011-01-21 11 views
9

Ci sono tonnellate di informazioni sul web relative al ciclo di vita di ASP.NET, ma non riesco a capire quando aggiungere dinamicamente i controlli alla pagina.Differenza con la creazione e l'aggiunta di controlli in PreInit Init

In generale ci sono due situazioni; una pagina aspx con una pagina master e una senza. Il libro che sto attualmente leggendo (70-515 self prep) dice di aggiungere controlli a una pagina senza una pagina master nel gestore di eventi preinit. Per aggiungere dinamicamente i controlli a una pagina dei contenuti, dovrei posizionare quella logica nel gestore di eventi init.

Secondo MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) Devo creare o ricreare controlli dinamici nel gestore di eventi preinit e solo leggere o inizializzare le proprietà dei controlli nel init eventhandler (che ha più senso per me). Googling around Vedo molte persone che usano l'eventhandler di init per aggiungere controlli.

Quindi, sono un po 'perso qui - qual è il modo corretto? E quando si utilizza il gestore di eventi preinit, come è possibile aggiungere controlli alla pagina quando tutti i controlli sono nulli? Ad esempio, quando è necessario aggiungere una casella di testo creata dinamicamente a un controllo del pannello?

Cordiali saluti,

risposta

8

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 :)

1

L'evento PreInit era nuovo per me, ma credo che ha senso, in modo da avere un passo intermedio tra il caricamento di controlli e del carico ViewState di fare un lavoro supplementare. Abbiamo utilizzato l'evento init per caricare i controlli dinamici e questo ha sempre funzionato per noi senza problemi. Penso che starai bene con entrambi, ma se MS raccomanda PreInit, direi di seguire questa strada. In questo modo, in Init, è possibile eseguire qualsiasi lavoro aggiuntivo che potrebbe essere necessario e separare la routine che crea l'interfaccia utente rispetto alla routine che può aggiornarlo prima del caricamento del viewstate.

HTH.