2011-01-21 25 views
9

Web上有很多關於ASP.NET生命週期的信息,但我似乎無法弄清楚什麼時候動態添加控件到頁面。在PreInit Init中創建和添加控件的區別

一般來說有兩種情況:帶有主頁面的aspx頁面,還有一個沒有。我目前正在閱讀的這本書(70-515自編)說,要將控件添加到preinit事件處理程序中沒有母版頁的頁面。要動態地將控件添加到內容頁面,我應該將該邏輯放在init事件處理程序中。

根據MSDN(http://msdn.microsoft.com/en-us/library/ms178472.aspx)我應該在preinit事件處理程序中創建或重新創建動態控件,並且只讀取或初始化控件的屬性init eventhandler(這對我來說最有意義)。谷歌搜索我看到很多人使用init eventhandler來添加控件。

所以,我在這裏有點失落 - 什麼是正確的方式?當使用preinit事件處理程序時,如何在所有控件爲空時將控件添加到頁面?例如,當您需要將動態創建的文本框添加到面板控件時?

親切的問候,

回答

8

除非您在跟蹤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事件中的所有外觀屬性已經應用到動態創建的文本框:)

1

的PreInit事件是新的給我,但我想這是有道理的,所以,你必須在控件的加載和視圖狀態負載之間的一箇中間步驟做額外的工作。我們使用init事件來加載動態控件,這對我們來說一直沒有問題。我認爲你們兩個都可以,但是如果MS推薦PreInit,我會說去那條路線。這樣,在Init中,您可以執行任何您可能需要的額外工作,並將創建UI的例程與可能在視圖狀態加載前更新它的例程分開。

HTH。

相關問題