2009-03-27 16 views
0

ここに問題があります。私は3つのコンポーネントを持っています...ユーザーコントロールとユーザーコントロールにあるサーバー側のコントロールを含むページ。ユーザーコントロールには、サーバー側のコントロールが何を変更するかをリッスンするイベントがいくつかあります。.NETコントロールのイベントとページのライフサイクル

サーバーコントロールは、イベントを必要とする多くの小さなASP.NETコントロールで満たされたテレビガイドの一覧を作成します。これらのコントロールはすべて動的に作成されます(サーバー側は明らかです)。このサーバーサイドコントロールを実装するには、本質的に集中的な操作が必要となるため、ポストバックごとに1回だけ実行する必要があります。イベント1とイベント2が発生し、基本的にサーバーサイドコントロールのレンダリング(並べ替え、フィルタリングなど)に関する事項が変更され、発生時にPopulateControlsを確実に呼び出す必要があります。

問題は次のとおりです。PopulateControlsを呼び出すための最適な場所を見つけることができません。私がPageLoadに置くと、イベントの前にリストが起動して描画されます。その後、私のイベントは、イベントに応答するPopulateControlsを呼び出す必要があります。 PreRenderで呼び出しを行うと、サーバーサイドコントロールのイベントは発生しません。なぜなら、私が読み込んだものからPageLoadの前または途中で作成する必要があるからです。

私はこのコールをどこに1回だけ呼び出す必要があり、適切なイベントに応答できるようにする必要がありますか?

はここ

public class MyPage : System.Web.UI.Page 
{ 
    protected UserControl MyUserControl; 

    // Wire up event handlers 
    MyUserControl.Event1 += OnEvent1; 
    MyUserControl.Event2 += OnEvent2; 

    public Page_Load() 
    { 
    } 

    public PreRender() 
    { 
     PopulateControls(); 
    } 

    private PopulateControls() 
    { 
     // Do intensive operation to populate controls 
    } 

    protected OnEvent1() 
    { 
    } 

    protected OnEvent2() 
    { 
    } 
} 

答えて

1

が、私はとにかくこれで亀裂を取る:

は、ここでユーザーコントロールとページのライフサイクルについて説明し、まともな記事です。あなたはあなたのイベントが正しく発射されることを可能にするために、コントロールの階層をinitalレンダリングと同じように作成する必要があります。イベントが発生した後に並べ替えを行う必要があるように聞こえるので、コントロールを2回作成する必要があります。

編集: ポストバック時にコントロールとコントロール階層を再作成する必要があります。ポストバックでコントロールを正しく再作成できるように、クライアントに十分な情報を送信する必要があります。これは、必要に応じてViewStateに情報を保存することで実行できます。

コントロール情報は、必要なときにのみ再計算してください。いくつかのポストバックイベントのためにあなたの場合。

基本的な流れは次のとおりです。 Loadイベントで、コントロールを作成するためにViewStateが必要ない場合は、populateメソッドを呼び出し、そうでない場合はViewStateから作成します。ポストバックが発生すると、Loadイベントでそれらが作成されますが、viewstateから再構築されているため、これは安価です。ポストバックイベントが発生すると、発生したイベントに応じて、新しいオーダーまたは新しい情報でコントロールを再作成するためのメソッドを作成します。

私がコントロールを構築しているときは、ページ上の他のコントロールからポストバックが発生した場合、コントロールがどのように動作するかを考えたいと思います。そのポストバックの影響を受けない限り、コントロールは同じように見えるはずです。データアクセスを行わずに再作成できるはずですが、以前の呼び出しで収集した情報から制御する必要があります。

私は私の答えを編集しました。うまくいけば、これは今やもっと鮮明です。

0

子コントロールに、コントロールのライフサイクルの「初期化」フェーズで呼び出される、CreateChildControlsの中に作成されるべきいくつかの擬似コードです。

+0

しかし、それは私の問題を解決しません。私がそこに作成した場合、イベントが後で発生したときにそれらを再作成する必要があります。イベントが描画される必要があるためです。 – cjserio

0

ページやその他の子コントロールで何かが発生する前に呼び出すイベントを呼び出すのに最適な場所はPageInit段階です。私はここで何かが足りない可能性があります http://www.codeasp.net/articles/asp.net/20/aspnet-page-lifecycle

+0

私はイベントを呼び出していません...イベントは、ユーザーが何かに応じて発生します...たとえば、OnClicksなど。 – cjserio

+0

私はあなたの質問を正しく理解している場合は、他の何もする前にあなたのユーザーコントロールのイベントを発生させたい。これにより、あなたのページのような他の場所でイベントが発生します。この場合、コントロールのバインドロジックを、ページ自体ではなくコントロールのPageInitに配置する必要があります。 – AaronS

+0

私は混乱しています...イベントの順序を調整することはできません。 http://msdn.microsoft.com/en-us/library/ms178472.aspxを参照してください。コントロールイベントは常にPage_Loadが完了した後に発生します。 – cjserio

関連する問題