2009-04-15 161 views
0

我瞭解在ASP.NET動態控制創造這片文字:動態控件創建

...當使用動態控件,您 必須記住,他們將存在 只有等到下一次回傳。 ASP.NET 將不會重新創建動態添加的 控件。如果您需要多次重新創建一個 控件,則應在 Page.Load事件處理程序中執行控件創建。這有 允許您使用視圖狀態與您的動態 控制的額外好處。儘管視圖狀態 通常是Page.Load 事件之前,如果你創建的 處理程序Page.Load性事件的控制恢復, ASP.NET將適用於任何視圖狀態 信息,它具有 後Page.Load事件處理程序結束。這 過程是自動 ...

我想試試例如 聲明創建一個按鈕 -

<asp:Button ID="Button1" runat="server" Text="Button" 
      onclick="Button1_Click" /> 

和動態背後碼5個複選框 -

protected void Page_Load(object sender, EventArgs e) 
{ 
    for (int i = 0; i <= 5; i++) 
    { 
     var chBox = new HtmlInputCheckBox(); 
     Controls.Add(chBox); 
    } 

} 

但是,當我檢查一些複選框,並按下按鈕後,回發所有複選框 狀態被刪除。這意味着ASP.NET不會自動管理動態控件 的視圖狀態?我試圖啓用每個複選框和整個頁面的視圖狀態,但它不起作用。 有人可以解釋一下: 1.爲什麼會這樣? 2.如何避免這種情況?

+0

嗨。在我的評論中看到更新的代碼,希望它能起作用。如果沒有,給我寫評論,我會看看我能否提供幫助。 – Kirtan 2009-04-15 16:43:03

回答

0

控件可以在Page_Init上創建。

protected void Page_Init(object sender, EventArguments e) 
{ 
    //Generate the checkboxes dynamically here. 
    CheckBox c; 
    for (int i = 0; i < 5; i++) { 
    c = new CheckBox(); 
    c.ID = "Checkbox" + i.ToString(); 

    divContainer.Controls.Add(c); //create a div with runat="Server" attribute or use an asp:Panel, etc. container controls. 
    } 
} 

之後,再次嘗試點擊按鈕,狀態將始終保持。

2

發生這種情況的原因是因爲爲了ASP.NET恢復POST的值,這些控件需要在加載之前成爲頁面的一部分。爲了使這項工作,你需要(如果可能的話)創建你的控件OnInit的頁面。

+0

private void Page_Init(object sender,System。EventArgs e) {(int i = 0; i <= 5; i ++) var chBox = new HtmlInputCheckBox(); Controls.Add(chBox); }} 沒有 報價變化:( – ge1serf 2009-04-15 15:38:13

+0

作爲OP,這已經工作在pageLoad的 – 2009-04-15 15:38:23

0

您必須爲每個動態控件設置一個ID,以便它們可以跨回發進行同步。

0

按我的理解 - 有無論身在何處的OnInit或的OnLoad 創建控件(但有些書的onLoad建議),事就是將它們放置 - 如果你 通過Controls.Add被地方 - 它將它們放在<form></form>之外,所以回發 不會佔用控件的狀態。在<form></form>內部創建一個佔位符並向此佔位符添加動態控件後,開始正常工作。