私は持っていUserControl
ます。SPGridView
メソッドでいくつかのコントロール ( . グリッド コントロールの列がマークアップ、ObjectDataSource
、Button
およびに追加されましたLabel
)を動的に作成しCreateChildControl
、それらをControls
コレクションに追加します。Button
これらのコントロールのうち 2 つ (およびLabel
) はポストバックで適切に追加されますが、そのうちの 1 つ ( MenuTemplate
) はそのようなコンテンツで例外を発生させます。
"ビューステートの読み込みに失敗しました。ビューステートの読み込み先のコントロール ツリーは、前の要求でビューステートを保存するために使用されたコントロール ツリーと一致する必要があります。たとえば、コントロールを動的に追加する場合、ポストバック中に追加されたコントロールは、最初のリクエストで追加されたコントロールのタイプと位置。」
コードをOnInit
メソッドに移動すると、すべてのコントロールが正常に追加されます。それで、質問があります:一部のコントロールが Controls コレクションに正常に追加され、他のコントロールがポストバックで失敗した理由を説明してもらえますか? CreateChildControls
ViewState hereについて読みました。おそらく、私はいくつかの瞬間を理解していませんでした。
私のコードを見てください:
protected override void CreateChildControls()
{
Label l = new Label();
l.ID = "labelTest";
l.Text = "Hello test!";
Button b = new Button();
b.Text = "Press test";
b.ID = "buttonTest";
b.Click += b_Click;
Controls.Add(l);
Controls.Add(b);
ObjectDataSource gridDataSource = new ObjectDataSource();
gridDataSource.ID = "gridDataSource";
gridDataSource.SelectMethod = "GetDataSource";
gridDataSource.TypeName = this.GetType().AssemblyQualifiedName;
Controls.Add(gridDataSource);
SPMenuField colMenu = new SPMenuField();
colMenu.HeaderText = "Test";
colMenu.TextFields = "Test";
colMenu.MenuTemplateId = "ListMenu";
// it is my SPGridView that added in markup
customGridView.Columns.Add(colMenu);
MenuTemplate titleListMenu = new MenuTemplate();
titleListMenu.ID = "ListMenu";
// The exception occurs here
Controls.Add(titleListMenu);
base.CreateChildControls();
}