3

ASP.NET Web フォーム複合コントロールがあります。これをコントロール A と呼びましょう。これには子複合コントロールが含まれており、これをコントロール B と呼びます。コントロール B の子コントロールは、コントロール A のプロパティに依存しています。

初期ロード時に、コントロール A の OnLoad でこのパラメータを設定しています。コントロール B が CreateChildControls で子コントロールを正しく設定すると、すべてが正常に機能します。

ただし、コントロール A のドロップダウンで SelectedIndexChanged を介してこのパラメーターを変更したい場合、イベント ハンドラーは、コントロール B のライフサイクルで処理が遅すぎて、変更された値を取得できないようです。これはおそらく、コントロール B の CreateChildControls メソッドが既に呼び出されているためです。

コントロール B を取得して子コントロールを更新し、通常のライフサイクルを経て、必要に応じてビューステートをロードできるようにするにはどうすればよいでしょうか?

わかりやすくするために、コントロール A のパラメーターが変更された場合、コントロール B の子コントロールには、一部が残り、一部が削除され、一部が追加される必要がある場合があります。ロード状態。

4

1 に答える 1

4

SelectedIndexChangedイベントは、ページとコントロールAのPage_Load(OnLoad)の後に処理されます。そして、このイベントハンドラーに到達するまでに、ページが既に再構築され、ビューステートがコントロールに復元されていると考えるのは正しいことです。つまり、ページ/コントロールがまだ再構築されていないときにイベントを処理するポイントは何ですか?

これについて私が提案する3つの簡単な解決策は次のとおりです。

  • コントロールBに親の値をチェックさせてから、それに応じてビルドする必要はありません。これは少しアンチパターンです。代わりに、ドロップダウンの値に応じて、コントロールAに適切なバージョンのコントロールBをロードさせます。IOWは、コントロールBではなく、ロードされるものに対してコントロールAに責任を負わせます。コントロールBはダムであり、その親が何であるかを気にする必要はありません。親とのインターフェースが必要な場合は、インターフェースを介して行う必要があります。

  • フィールドを非表示にして表示するだけの場合は、すべてをコントロールBに配置し、表示すべきでないフィールドを非表示にします。表示プロパティをfalseに設定すると、ほとんどのコントロールはHTMLを出力ストリームにレンダリングしないため、ページがクライアントに返送されたときのクライアント側への影響は最小限に抑えられます。

  • 選択した値に応じて、コントロールA自体の一部を再構築します。DIVを含めることができ、div.Controls.Clear()を実行してから、適切なコントロールを追加し直します。これは、SelectedIndexChangedイベントで行うのが適切です。これは、既に存在するコントロールとその値を気にしないためです(既存のコントロールの一部を気にする場合は、それらをクリアしないのは比較的簡単です。コントロールコレクションとそれらの周りに新しいコントロールを追加する)

これらの3つの方法にはそれぞれ長所と短所があり、最終的には3つの方法を組み合わせて実行することになります。PageParserとそのGetCompiledPageInstanceメソッドを使用してページの再生成に使用するIHttpHandlerを取得する別の可能なメソッドもありますが、それはここで小さな返信でカバーするために進む方法です。

于 2009-12-06T11:10:37.797 に答える