2010-05-18 60 views
0

這真的應該更容易,所以我必須錯過一些明顯的東西。我有一個啓用AJAX的C#ASP.NET頁面。我也有一個最初爲空的ASP.NET面板,但我創建了幾個下拉列表並將它們添加到後面的代碼中。這部分工作得很好。但是,當頁面進行回發時,控件「消失」,我根本找不到它們。請注意,面板本身不在AJAX更新面板中,我只提到它,因爲我認爲它可能是一個視圖狀態問題。C#&AJAX - 動態添加控件,但在回發中找不到它們

此代碼工作得很好:

DropDownList newList = new DropDownList(); 
newList.ID = string.Format("lst{0}", opt.OptionName.ToString()); 

foreach (SaleItemOptions myOpt in opt.OptionsInList) 
    { 
newList.Items.Add(myOpt.OptionName); 
    } 

this.pnlOptions.Controls.Add(newList); 

但這個代碼總是返回NULL

DropDownList myList = (DropDownList)this.pnlOptions.FindControl("lstSize"); 

我已驗證控件名的形式存在,我也用類似的變化ControlID,ID等。

此外,還有一個緩解因素在所有這些。我使用GCheckout API(Google Checkout for ASP.NET)創建回發。這真的不應該是一個問題,但認爲我會提到它

回答

0

動態創建的控件在回發時總是丟失。每次回帖時都需要重新創建它們。如果您希望跨發佈帖子保留其值,則需要在查看狀態,會話中自己跟蹤這些值,或查看發送到頁面的帖子值。您可以通過設置控件的唯一ID並查找該值來完成此操作。

+0

因此,我非常喜歡MVC。 – 7wp 2010-05-18 15:48:33

+0

@Roberto,是的MVC確實讓這更容易,我建議OP在這裏看看它: http://www.asp.net/mvc/whatisaspmvc – Justin 2010-05-18 16:32:40

3

您是否在回發後將控件添加到頁面?你需要這樣做來回收他們的價值觀,如果你不這樣做,他們就不存在。如果你再次添加它們,那麼你可以得到他們發佈的返回值。最好的做法是通過過濾頁面的init方法,這樣,在asp.net實例化標記中的控件的同時,您的動態添加的控件將被實例化。

+0

忘喲提及,我這樣做,與LoadViewState與此代碼從MS: 保護覆蓋無效LoadViewState(對象savedState) { base.LoadViewState(savedState); if(ViewState [「controsladded」] == null) AddControls(newSale); } – 2010-05-18 15:37:54