2011-03-25 52 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

相关问题