2010-05-18 58 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