現在、ページの読み込み時に項目がデータベースからバインドされる静的なドロップダウン リストがあります。このドロップダウン リストでの選択に基づいて、ID の「CustomControl1」、「CustomControl2」などのテーブルに一連のコントロールを動的に生成しています。ドロップダウン リストで選択するたびに、異なるコントロール タイプのコントロールの一意のセットですが、それらはすべて同じ ID (生成された順序に基づく) を持ちます。したがって、新しいコントロール セットを生成しようとすると、次のエラーが発生します。
ビューステートの読み込みに失敗しました。ビューステートが読み込まれるコントロール ツリーは、前の要求でビューステートを保存するために使用されたコントロール ツリーと一致する必要があります。たとえば、コントロールを動的に追加する場合、ポストバック中に追加されたコントロールは、最初のリクエスト中に追加されたコントロールのタイプと位置と一致する必要があります。
したがって、ページの読み込みでは、xml に基づいてコントロールを生成するメソッドと、次のような検証コントロールを作成するメソッドの 2 つのメソッドがあります。
if (xml != "" && externalProperties.Rows.Count == 0)
{
LoadExternalProperties(xml);
ValidateExternalProperties(xml);
}
最初の選択を行うと、コントロールを適切に生成できますが、2 番目の選択を行うと、ビューステートが異なるコントロール タイプと一致しないため、コントロールを生成できません。
したがって、ビューステートをクリアする必要があると思います。私は次のことを試しました:
viewstate を null に設定する (Page_Init および In の外で試行):
ViewState["CustomControl1"] = null;
テーブルの行をクリアする:
externalProperties.Rows.Clear();
コントロールのテーブルをクリアする:
externalProperties.Controls.Clear();
コントロールのロード前後の EnableViewState の切り替え:
externalProperties.EnableViewState = false;
LoadExternalProperties(xml);
externalProperties.EnableViewState = true;
- ドロップダウンリストの選択されたインデックスが変更されたときにのみビューステートをクリアする必要があります。これは、次の手順 (ウィザードを使用) で値を取得し、それらを他の目的に使用しているためです。
ビューステートをいつクリアする必要があるかを把握するために、現在、以前に選択したインデックスを追跡しています。