清除动态创建的控件的Viewstate以添加新控件

时间:2012-08-17 15:29:51

标签: c# asp.net controls viewstate dynamically-generated

我目前有一个静态下拉列表,其项目从Page Load上的数据库绑定。基于此下拉列表中的选择,我在表中动态生成一组控件,ID为“CustomControl1”,“CustomControl2”等。我需要做的是下拉列表中的每个选项都有一个不同控件类型的唯一控件集,但它们都具有相同的ID(基于它们生成的顺序)。因此,当我尝试生成一组新控件时,我收到此错误:

  

无法加载视图状态。正在加载视图状态的控制树必须与在上一个请求期间用于保存视图状态的控制树匹配。例如,在动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。

所以在页面加载中我有两个方法,一个是基于xml生成控件,另一个是创建验证控件,如下所示:

        if (xml != "" && externalProperties.Rows.Count == 0)
        {
            LoadExternalProperties(xml);
            ValidateExternalProperties(xml);
        }

当我进行初始选择时,我能够正确生成控件,当我进行二次选择时,无法生成控件,因为视图状态与不同的控件类型不匹配。

所以我认为我需要做的是清除视图状态。我尝试过以下方法:

将viewstate设置为null(在Page_Init和In之外尝试):

ViewState["CustomControl1"] = null;

清除行表:

externalProperties.Rows.Clear();

清除控件表:

externalProperties.Controls.Clear();

在加载控件之前和之后切换EnableViewState:

externalProperties.EnableViewState = false;
LoadExternalProperties(xml);
externalProperties.EnableViewState = true;
  • 我只需要在下拉列表的选定索引更改时清除视图状态。这是因为在下面的步骤中(使用向导),我正在检索这些值并将它们用于其他目的。

我目前正在跟踪之前选择的索引,以便弄清楚何时需要清除视图状态。

1 个答案:

答案 0 :(得分:0)

您应该下拉列表控件的 EnableViewState = false