2011-12-20 15 views
0

ボタン付きのASP.NETユーザーコントロールがあり、ユーザーが別のユーザーコントロールからボタンをクリックしたときにページに追加したいと考えています。最初のユーザーコントロールのイベントハンドラーを作成してページから処理し、2番目のユーザーコントロールをページに追加しました。すべて正常に動作していますが、2番目のユーザーコントロールのボタンはイベントに応答しません。実行時にASP.NETユーザーコントロールをロードする

私はRadAjaxPanel

注上の第二コントロールを配置:私は、設計時にその作業罰金を第2のユーザコントロールを追加します。

+1

いくつかのコードを投稿できますか? – Strillo

+2

ご利用のコードをお知らせください。 –

+0

どのようなコードが必要ですか? –

答えて

3

すべての動的に作成されたコントロールは、Page_Initの最後に追加する必要があります(ただし、Page_Loadの末尾に追加されることもあります)。

ボタンクリックイベントに基づいて追加する場合は、ライフサイクルでPage_InitおよびPage_Loadを発生させるイベントハンドラでこれを実行します。これがイベントが発生しない理由と動作する理由ですデザイン時に追加するときれいになります。

これは、2番目のユーザーコントロールでボタンをクリックすると、ページライフサイクル全体が再び開始されるためです。ページはPage_LoadとPage_Initを最初に通過し、コントロールはここでロードされません。したがって、ページライフサイクルが「ハンドルポストバックイベント」の部分を処理するとき、コントロールは実際には存在しないので、イベントは発生しません。

逆に、デザインタイムに追加すると、Page_InitとPage_Loadにコントロールが存在するため、コントロールツリーに既に存在するので、ユーザーコントロールからポストバックイベントを処理できるようになります。

Page_Loadが最後に完了するまでに追加されるように再構成する方法を考える必要があります。コードサンプルや詳細がなければ、これを行う方法を正確に示唆するのは難しいです。 1つの可能性は、それを完全にロードするのではなく、目に見えるように設定することです。しかし、コントロールがデータベースのヒットやAPIコールのように負荷が重い場合、これはあなたには適していない可能性があります。

私は同様のことをしました。私がしたのは、DropDownListからの選択に基づいていくつかのコントロールを動的にロードすることでした。あなたはあなたのためのコントロールをロードする方法を持っている場合、あなたはこのような何か行うことができます、のはLoadControls()それを呼びましょう:ViewStateの変数を設定することにより

DropDownList_Click { 
ViewState("LoadControls") = true; 
LoadControls() 
} 

を、あなたは、将来のポストバックのコントロールをロードするためのPage_Loadを示すことができ:

Page_Load { 
if (ViewState("LoadControls") == "true") 
{ 
    LoadControls(); 
} 
} 

次いで、これをライフサイクルの将来の時点で、イベントが最初に発生したときにオンザフライで、及びコントロールをロードする効果を有します。

+0

私はあなたを理解しています。そのようなものが必要です http://demos.telerik.com/aspnet-ajax/ajax/examples/common/loadingusercontrols/ defaultcs.aspx –

+0

あなたはおそらくかなり近くにいるでしょう - ViewStateに何かを設定して、コントロールをロードし、ViewStateフラグがtrueに設定されている場合はPage_Loadにロードする必要があることを示すフラグを設定します。 – bgs264

+0

ありがとうございました! +1!それは私をたくさん助けました! – Mike

関連する問題