2012-03-30 71 views
4

MSDN說在頁面生命週期的PreInit事件中創建動態控件。在頁面生命週期的PreInit事件中創建動態控件?

http://msdn.microsoft.com/en-us/library/ms178472.aspx

爲什麼?

通過在PreInit事件中創建派生了哪些優勢?

我看過代碼,開發人員在Page_Load方法中創建動態控件嗎?

如果有什麼區別?

問候

+0

http://stackoverflow.com/q/4761273/284240'OnLoad'可能會工作,但並非總是如此,您在'OnInit'安全的一面。 – 2012-03-30 23:20:03

回答

4

,如果你不需要擔心保存控件ViewState在回發,但如果你需要堅持吧,Load階段是不是你應該添加這些控件Page_Load工作正常。

在ViewState加載之前,動態控件必須存在於頁面的控件層次結構中。在加載視圖狀態 - 初始化之前只有一個階段。這意味着,如果您希望動態控件保持視圖狀態,則必須將它們添加到頁面的Init事件中的控件層次結構中。

http://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx

但是記住,因爲它尚未加載您不能訪問ViewStateInit事件。因此,如果需要,您需要使用不同的持久性媒介來存儲跨回傳的變量(如Session)。

+0

我不明白你的意思,「如果你想讓你的動態控件保持視圖狀態,你必須將它們添加到頁面的Init事件中的控件層次結構中」。我有一個問題,我需要在創建子View動態控件的ViewState後繼續使用跨回發使用的值,並且可以在設置它們的父級後在頁面'Load'事件中使用它們的ViewState。我錯過了什麼? – ceztko 2014-04-17 21:10:47

+0

[這裏](http://stackoverflow.com/a/23143377/213871)我正在談論的例子。 – ceztko 2014-04-17 21:15:57

0

Tim, 感謝您的回覆。 我做了一個小實驗,我在Page_Load方法中動態創建並添加了一個TextBox控件。

在頁面上Button的Postback click事件中,我試圖獲取TextBox的Text屬性的值。 當控件在Page_Load事件中動態添加而不是OnPreInt方法時,我能夠獲得按鈕的單擊事件中的值。 即使在Page_Load方法中添加了控件,我仍然認爲Text值保留在ViewState中。

<div> 
     <p> 
      <asp:Label ID="lbl" runat="server" /> 
     </p> 
     <p> 
      <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder> 
     </p> 
     <p> 
      <asp:Button ID="btn" runat="server" Text="Click" OnClick="btn_Click" /> 
     </p> 
    </div> 


private void _createTextBox() 
{ 
    TextBox textBox = new TextBox(); 
    textBox.ID = "txtBox"; 
    textBox.Width = 250; 
    textBox.ReadOnly = false; 
    plcHolder.Controls.Add(textBox); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    _createTextBox(); 
    if (!this.IsPostBack) 
    { 
     Control ctrl = plcHolder.FindControl("txtBox"); 
     if (ctrl != null) 
     { 
      TextBox txtBox = ctrl as TextBox; 
      txtBox.Text = DateTime.Now.ToString(); 
     } 
    } 
} 
protected void btn_Click(object sender, EventArgs e) 
{ 
    Control ctrl = plcHolder.FindControl("txtBox"); 
    if (ctrl != null) 
    { 
     TextBox txtBox = ctrl as TextBox; 
     lbl.Text = txtBox.Text; 
    } 
} 

請讓我知道這是正確的還是我在做什麼錯:

的代碼如下?

2

這個回覆可能會延遲原始海報,但我認爲這可能會幫助其他人。

如果您的應用程序/網站沒有使用母版頁,最好在Page_PreInit事件中創建控件。但是,如果您使用母版頁並希望在運行時在內容頁面上創建控件,則Page_Init是理想的事件。

您也可以在Page_Load上創建控件,但要記住加載視圖狀態後觸發頁面加載。