2011-01-21 10 views
9

Istnieje mnóstwo informacji w sieci o cyklu życia ASP.NET, ale nie mogę się domyślić, kiedy dynamicznie dodawać elementy sterujące do strony.Różnica z tworzeniem i dodawaniem formantów w PreInit Init

Ogólnie istnieją dwie sytuacje; stronę aspx ze stroną główną i jedną bez. Książka, którą właśnie czytam (70-515 self prep) mówi o dodaniu kontrolek do strony bez strony wzorcowej w module zdarzeń wstępnych. Aby dynamicznie dodawać elementy sterujące do strony treści, powinienem umieścić tę logikę w module obsługi zdarzenia init.

Według MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) powinienem utworzyć lub odtworzyć dynamiczne elementy sterujące w module zdarzeń wstępnych preinit, a jedynie odczytać lub zainicjować właściwości kontrolek w init eventhandler (co jest dla mnie najbardziej sensowne). Googling dookoła Widzę wiele osób używających EventLogera init do dodawania kontrolek.

Tak, jestem trochę zagubiony tutaj - jaki jest właściwy sposób? A jeśli korzystasz z modułu obsługi zdarzeń preinit, w jaki sposób możesz dodać elementy sterujące do strony, gdy wszystkie formanty są puste? Na przykład, kiedy trzeba dodać dynamicznie utworzony pole tekstowe do kontrolki panelu?

poważaniem,

Odpowiedz

8

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

1

zdarzenie PreInit było dla mnie nowe, ale myślę, że to ma sens, tak że trzeba etap pośredni pomiędzy załadunku kontroli i obciążenia viewstate zrobić dodatkowej pracy. Wykorzystaliśmy zdarzenie init do wczytania dynamicznych elementów sterujących, co zawsze działało dla nas bez żadnych problemów. Myślę, że będziesz w porządku z obaj, ale jeśli stwardnienie rozsiane zaleca PreInit, powiedziałbym pójść tamtą trasę. W ten sposób w Init możesz wykonać dowolną dodatkową pracę, którą możesz potrzebować i oddzielić rutynę, która tworzy interfejs użytkownika w porównaniu z procedurą, która może go zaktualizować przed załadowaniem stanu wyświetlania.

HTH.

Powiązane problemy