2011-05-24 59 views
0

下午好。Page_Init PreRender控件,Asp.net

我有一個在Page_Load上動態創建的面板列表。控件通過Control.Add(p)添加;方法。代碼如下

Panel p = new Panel(); 
p.ID = "cell_" + i + "_" + j; 
p.Attributes.Add("runat", "server"); 
p.TabIndex = -1; 
p.Attributes.Add("class", "box"); 
p.Attributes.Add("onClick", "clicked(this);"); 
p.Attributes.Add("onKeypress", "changeValue(event, this);"); 
p.Style.Add(HtmlTextWriterStyle.Top, top + "%"); 
p.Style.Add(HtmlTextWriterStyle.Left, left + "%"); 
p.Attributes.Add("Text", value); 

PanelList.Add(p); 

該代碼塊位於for循環中,每個循環都會更改i,j,left,right和value變量。

現在,當我調用這個函數之前的Page_Load飾面:

foreach (Control c in clientGrid.Controls) 
{ 
    Response.Write(c.ClientID.ToString()); 
} 

它成功地寫入所有動態創建的面板的所有客戶端的ID。

但是,當我在回發上運行foreach函數時,Response.write什麼也不顯示。它好像asp已經忘記了這些面板存在!

現在我聽到了Page_Init(),控件需要重新渲染!

林不知道如何做到這一點和許多谷歌後,似乎無法找到答案。使用recurtion通過所有Page.Controls迭代並拉出

System.Web.UI.WebControls.Panel 

但仍沒有運氣:(

我用盡

如果我在不清楚的問題,我不能提供更多的代碼和細節: )

三江源

亞歷

回答

1

每次回發時,必須將動態添加的控件重新添加到頁面中。我不知道這是否符合您的邏輯要求,但確保您在(!isPostback)條件之外的page_load方法中添加控件。然後確保在將控件添加到頁面後調用寫出客戶端ID的邏輯。

如果您需要在回發之間存儲有關這些控件的狀態信息,則可能必須使用一些javascript和hiddenfields。

所有的事件處理程序應該在Page_Load之後調用,所以如果你在Page_Load中添加控件,你應該沒問題。 OnPreRender有時對這類事情有用。它在Page_Load之後但在回發完成之前被調用。

+0

你先生...是天才 – 2011-05-24 15:38:02

+0

謝謝。我不是一個天才,但我不得不在多次處理動態添加控件的頭痛問題。我很高興這有助於。 – 2011-05-24 16:17:45

+0

我會建議在Page_Init中加載動態控件,因爲這樣,根據[頁面生命週期概述](http://msdn.microsoft.com/zh-cn/library/ms178472),viewstate將正確地重新填充到這些控件中的.aspx)。否則,你必須手動維護它。 – Roman 2012-07-11 21:27:54