ですから、私は、ページのライフサイクル/ビューステートの問題に苦労しています。3つのListViewコントロールをホストするページがあります。常に1つだけが表示されます。単一のDataPagerを使用して、DataPagerのPagedControlIDを表示されているListViewのIDにプログラムで割り当てたいと思います。DataPagerは、主にDataPagerへの単なるパススルーであるユーザー定義ユーザーコントロール(ASCX)に含まれていることを指摘するのが適切かもしれません。
エラーは十分に単純なようです...
[InvalidOperationException: No IPageableItemContainer was found. Verify that either the DataPager is inside an IPageableItemContainer or PagedControlID is set to the control ID of an IPageableItemContainer.]
System.Web.UI.WebControls.DataPager.LoadControlState(Object savedState) +628838
System.Web.UI.Control.LoadControlStateInternal(Object savedStateObj) +137
System.Web.UI.Page.LoadAllState() +342
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2533
これが現在の一連のイベントです。
ListViewが表示される「詳細」ページにリンクする「概要」ページがあります。
「SUMMARY」ページのリンクをクリックすると、コントロールが「DETAIL」ページに転送され(リダイレクトされません)、「SUMMARY」ページのプロパティをPage.PreviousPageプロパティを介して「DETAIL」に転送できます。ページ。
ターゲットの「DETAIL」ページのOnInitCompleteイベントで、「PreviousPage」のプロパティ値を新しい「DETAIL」ページのプロパティに割り当てます。
protected override void OnInitComplete(EventArgs e) { IExceptionPage previousPage = (PreviousPage != null) ? ((IExceptionPage)PreviousPage) : null; if (previousPage != null) { this.ActiveListID = previousPage.ActiveListID; this.ActionType = previousPage.ActionType; this.CategoryTheme = previousPage.CategoryTheme; this.ExceptionCode = previousPage.ExceptionCode; } }
これらの「DETAIL」ページのプロパティは単にViewStateに対して読み取りと書き込みを行うため、OnInitCompleteイベントでこれらのプロパティに値を割り当てることにより、これらの値がこのページの将来のポストバック間で保持されることを期待しています。これらのプロパティの1つは、DataPagerをバインドするListViewのIDです。
public String ActiveListID { get { return (String)ViewState["ActiveListID"]; } set { ViewState["ActiveListID"] = value; } }
ここで、OnPreLoadイベントで、DataPagerコントロールのPagedControlIDプロパティを、ViewState属性に格納されているListViewのIDに設定しました。
ページの初期読み込みは問題なく進行します。
この問題は、ページに投稿するようなことをしようとすると発生します。OnInitCompleteイベントハンドラーとOnPreLoadイベントハンドラーの間で、「InvalidOperationException」エラーがスローされます。
エラーを見ると、PagerのPagedControlIDプロパティが正しく設定されていないようです。私が理解していないのはその理由です。
ポケットベルは、以前に設定されたPagedControlIDを覚えておくべきではありませんか?ポケットベル独自のViewStateに保存されていませんか?
そうでない場合、ViewStateトラッキングがオンになっているOnPreLoadの前にエラーがスローされるのはなぜですか(これは、OnLoadイベントで設定されているMicrosoftのMSDNの例と矛盾しています)。
OnInitイベントでPreLoadイベントの前にPagedControlIDを設定しようとしましたが、最初にロードされたページがViewStateに存在しなくなったため、NULL値が返されるという問題が発生しました。また、IDがViewStateに保存されない理由もわかりません。私が参照しているMSDNのドキュメントによると、OnInitCompleteイベントで設定すると、追跡されるViewState値に含める必要があります。
誰かがこれについて何か考えを持っているなら、私は最も感謝するでしょう。
ありがとう、G