MSDN說在頁面生命週期的PreInit事件中創建動態控件。在頁面生命週期的PreInit事件中創建動態控件?
http://msdn.microsoft.com/en-us/library/ms178472.aspx
爲什麼?
通過在PreInit事件中創建派生了哪些優勢?
我看過代碼,開發人員在Page_Load方法中創建動態控件嗎?
如果有什麼區別?
問候
MSDN說在頁面生命週期的PreInit事件中創建動態控件。在頁面生命週期的PreInit事件中創建動態控件?
http://msdn.microsoft.com/en-us/library/ms178472.aspx
爲什麼?
通過在PreInit事件中創建派生了哪些優勢?
我看過代碼,開發人員在Page_Load方法中創建動態控件嗎?
如果有什麼區別?
問候
,如果你不需要擔心保存控件ViewState
在回發,但如果你需要堅持吧,Load
階段是不是你應該添加這些控件Page_Load
工作正常。
在ViewState加載之前,動態控件必須存在於頁面的控件層次結構中。在加載視圖狀態 - 初始化之前只有一個階段。這意味着,如果您希望動態控件保持視圖狀態,則必須將它們添加到頁面的Init
事件中的控件層次結構中。
http://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx
但是記住,因爲它尚未加載您不能訪問ViewState
在Init
事件。因此,如果需要,您需要使用不同的持久性媒介來存儲跨回傳的變量(如Session)。
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;
}
}
請讓我知道這是正確的還是我在做什麼錯:
的代碼如下?
這個回覆可能會延遲原始海報,但我認爲這可能會幫助其他人。
如果您的應用程序/網站沒有使用母版頁,最好在Page_PreInit事件中創建控件。但是,如果您使用母版頁並希望在運行時在內容頁面上創建控件,則Page_Init是理想的事件。
您也可以在Page_Load上創建控件,但要記住加載視圖狀態後觸發頁面加載。
http://stackoverflow.com/q/4761273/284240'OnLoad'可能會工作,但並非總是如此,您在'OnInit'安全的一面。 – 2012-03-30 23:20:03