C# 动态用户控件在回发时保留状态

C# 动态用户控件在回发时保留状态,c#,asp.net,webforms,C#,Asp.net,Webforms,我很难面对ASP.NET Web表单中的动态用户控件的问题(我知道它们很糟糕,但我的项目依赖于它们)。简单地说,我的情况是: 我在我的aspx页面中有一个下拉列表,有几个选项可供选择 from(对于每个控件,我有不同的用户控件来渲染) 当我选择一个选项时,此选项的用户控件将呈现在UpdatePanel内的占位符中: 在DropDownList SelectedIndexChanged方法中的代码隐藏中,我使用Page.LoadControl(string virtualPath)创建用户控件的

我很难面对ASP.NET Web表单中的动态用户控件的问题(我知道它们很糟糕,但我的项目依赖于它们)。简单地说,我的情况是:

  • 我在我的aspx页面中有一个下拉列表,有几个选项可供选择 from(对于每个控件,我有不同的用户控件来渲染)
  • 当我选择一个选项时,此选项的用户控件将呈现在UpdatePanel内的占位符中:
  • 在DropDownList SelectedIndexChanged方法中的代码隐藏中,我使用Page.LoadControl(string virtualPath)创建用户控件的实例,然后将其添加到placeholder的控件中:

    selectedFilters.Controls.Add(myUserControlObject); selectedFilters.Controls.Add(myUserControlObject)
    第一个用户控件渲染为ok,但当我尝试将新用户控件添加到占位符时,第一个用户控件将消失,仅渲染新用户控件。如何保持整个用户控件对象的状态,以便在回发期间它们不会丢失

    您需要在每次回发时添加每个动态添加的控件,这通常最好在Page_PreLoad事件中完成,以便动态添加的控件将根据ViewState和发布的值返回到其上一个状态

    可以使用ViewState存储已添加的控件。您将如何执行此操作取决于您的环境,但可能是这样的,当您动态添加控件时,您将执行此操作:

    ViewState["DynamicControl1"] = true;
    
    然后在页面预加载事件中

    if ((bool)ViewState["DynamicControl1"])
    {
        //Add your control again here,
        //possibly duplicated from your DropDownList SelectedIndexChanged handler
    }
    
    根据ViewState设置,只要控件添加到页面生命周期的右侧,ASP.NET就会自动重新填充DropDownList项目列表和选定值。如果已禁用ViewState,则在Page_PreLoad事件中添加控件时,需要重新填充列表项


    请注意,动态添加的控件在每次回发时都具有相同的ID,这一点很重要,因此如果您遇到问题,请尝试将ClientIDMode设置为“AutoID”。

    我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。