1

私は持っていUserControlます。SPGridViewメソッドでいくつかのコントロール ( . グリッド コントロールの列がマークアップ、ObjectDataSourceButtonおよびに追加されましたLabel)を動的に作成しCreateChildControl、それらをControlsコレクションに追加します。Buttonこれらのコントロールのうち 2 つ (およびLabel) はポストバックで適切に追加されますが、そのうちの 1 つ ( MenuTemplate) はそのようなコンテンツで例外を発生させます。

"ビューステートの読み込みに失敗しました。ビューステートの読み込み先のコントロール ツリーは、前の要求でビューステートを保存するために使用されたコントロール ツリーと一致する必要があります。たとえば、コントロールを動的に追加する場合、ポストバック中に追加されたコントロールは、最初のリクエストで追加されたコントロールのタイプと位置。

コードをOnInitメソッドに移動すると、すべてのコントロールが正常に追加されます。それで、質問があります:一部のコントロールが Controls コレクションに正常に追加され、他のコントロールがポストバックで失敗した理由を説明してもらえますか? CreateChildControlsViewState 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();
}
4

1 に答える 1

0

テンプレート自体ではなく、ポストバックで保持されるように、Page_Loadまたは他のイベント(つまり、Page_Initの後)でのみテンプレートにアイテムを追加できると思います。テンプレートは、Page_Initステージの前またはステージで作成する必要があります。ビューステートからそのテンプレートにコントロールをロードしないか、エラーが発生する可能性があります。

于 2012-08-03T08:50:34.847 に答える