2011-03-25 51 views
0

我試圖在運行時將用戶控件添加到div中。我可以添加控件沒有probelem,但它會覆蓋添加的上一個控件。以編程方式在頁面中添加用戶控件,同時保留已存在的控件

基本上,我試圖增加乘客到一個旅行系統 - 乘客的詳細信息在用戶控制中,我事先不知道會有多少人。我有一個添加新乘客按鈕,應該將新用戶控件附加到div中,而不會覆蓋以前的乘客。

的代碼是C#/。NET 4.

我試圖挽救控制數據到視圖狀態,並重新用新的補充,但也不能正常工作。下面是代碼片段我使用

foreach (Control uc in p_passengers.Controls) { 
     Passenger p = uc as Passenger; 
     if (p != null) { 
      p.SaveValues();    
     } 
    } 

然而,p.SaveAs()(只寫控制值到ViewState中)從未擊中。

我確定它只是一些愚蠢的,但任何想法?

乾杯傢伙。

+1

如何以及何時添加該控件? – 2011-03-25 15:28:34

+0

您在Init,Load,PreRender中執行了哪個頁面事件? – derek 2011-03-25 15:34:12

+0

我在鏈接按鈕的點擊處理程序中添加控件。 – 2011-03-25 17:16:57

回答

3

您是re-creating all of your dynamic controls for every postback

記住每個回發是Page類的新實例,並且您以前創建的任何控件都需要顯式重新創建。

更新

如果你不得不在ViewState中添加的項目,像這樣的一個名單..

private List<string> Items 
    { 
     get 
     { 
       return ViewState["Items"] = (ViewState["Items"] ?? new List<string>()); 
     } 
    } 

然後在點擊處理程序,你可以簡單地添加到這個列表:

private void btn_Click(object sender, EventArgs e) 
    { 
     this.Items.Add("Another Item"); 
    } 

然後覆蓋CreateChildControls

protected overrides CreateChildControls() 
    { 
     foreach (string item in this.Items) 
     { 
      Passanger p = new Passenger(); 
      p.Something = item; 
      this.p_passengers.Controls.Add(p); 
     } 
    } 
+0

我認爲這就是我試圖用SaveValues方法做的事情。我可以將控制權保留在視圖狀態中,但是foreach中的行不會受到影響。我看到有人做foreach(UserControl ...),但是這給了我例外。 – 2011-03-25 17:21:06

+0

re:update - 這看起來幾乎正是我想要做的。我閱讀了那篇文章,但正在努力把兩個和兩個放在一起。我需要它重新創建添加控件的視圖狀態(用戶數據可能不會在此階段持續),我可以將整個乘客對象存儲在視圖狀態還是有點多? – 2011-03-30 00:05:30

+1

已修復! @RichardFriend,謝謝你指點我正確的方向。這是不重新創建控件。我必須做一些有點不同的事情,並最終使用這個控件,它可以自動保存動態元素和視圖狀態: [link](http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx) – 2011-03-30 03:00:31

相關問題