C# 以编程方式将用户控件添加到页面,同时保留已存在的控件

C# 以编程方式将用户控件添加到页面,同时保留已存在的控件,c#,asp.net,user-controls,runtime,C#,Asp.net,User Controls,Runtime,我试图在运行时将用户控件添加到div中。我可以添加控件,但它会覆盖以前添加的控件 基本上,我正在尝试将乘客添加到旅行系统中-乘客详细信息在用户控制中,我不知道会有多少乘客。我有一个AddNewPassenger按钮,它应该将新的用户控件附加到div中,而不会覆盖以前的乘客 代码是c#/.net4 我试图将控件数据保存到viewstate中,并用新的控件数据重新添加,但这也不起作用。下面是我正在使用的代码片段 foreach (Control uc in p_passengers.Controls

我试图在运行时将用户控件添加到div中。我可以添加控件,但它会覆盖以前添加的控件

基本上,我正在尝试将乘客添加到旅行系统中-乘客详细信息在用户控制中,我不知道会有多少乘客。我有一个AddNewPassenger按钮,它应该将新的用户控件附加到div中,而不会覆盖以前的乘客

代码是c#/.net4

我试图将控件数据保存到viewstate中,并用新的控件数据重新添加,但这也不起作用。下面是我正在使用的代码片段

foreach (Control uc in p_passengers.Controls) {
        Passenger p = uc as Passenger;
        if (p != null) {
            p.SaveValues();            
        }
    }
但是,永远不会命中p.SaveAs()(只是将控件值写入ViewState)

我相信这只是一些愚蠢的事情,但有什么想法吗

干杯,伙计们。

你们呢

请记住,每个回发都是Page类的一个新实例,您以前创建的任何控件都需要显式地重新创建

更新

如果您在viewstate中有一个添加项的列表,则如下所示

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

是吗

请记住,每个回发都是Page类的一个新实例,您以前创建的任何控件都需要显式地重新创建

更新

如果您在viewstate中有一个添加项的列表,则如下所示

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


如何以及何时添加该控件?在哪个页面事件中执行此操作,Init,Load,PreRender?我正在链接按钮的单击处理程序中添加该控件。如何以及何时添加该控件?在哪个页面事件中执行此操作,Init,Load,PreRender?我正在链接按钮的点击处理程序中添加控件。我想这就是我试图使用SaveValues方法所做的。我可以将控件持久化到viewstate,但是foreach中的行永远不会被命中。我看到有人在做foreach(UserControl…),但这给了我cast异常。re:update-这看起来和我想做的差不多。我读了那篇文章,但很难把两者结合起来。我需要它为添加的控件重新创建viewstate(用户数据在此阶段可能不会被持久化),我可以将整个乘客对象隐藏在viewstate中吗?还是有点太多?修复了@RichardFriend,谢谢你给我指明了正确的方向。这是因为没有重新创建控件。我不得不做一些不同的事情,最后使用了这个控件,它可以自动持久化动态元素和视图状态:我想这就是我试图用SaveValues方法做的事情。我可以将控件持久化到viewstate,但是foreach中的行永远不会被命中。我看到有人在做foreach(UserControl…),但这给了我cast异常。re:update-这看起来和我想做的差不多。我读了那篇文章,但很难把两者结合起来。我需要它为添加的控件重新创建viewstate(用户数据在此阶段可能不会被持久化),我可以将整个乘客对象隐藏在viewstate中吗?还是有点太多?修复了@RichardFriend,谢谢你给我指明了正确的方向。这是因为没有重新创建控件。我不得不做一些不同的事情,最终使用了这个控件,它可以自动持久化动态元素和视图状态:
  protected overrides CreateChildControls()
  {
       foreach (string item in this.Items)
       {
            Passanger p = new Passenger();
            p.Something = item;
            this.p_passengers.Controls.Add(p);
       }
  }