本質的に、ページロード時に動的にページにプレースホルダを追加しました。ASP.netは動的にコントロールイベント処理を作成しました
次に、プレースホルダに追加され、特定のページイベントの実行時に表示されるコンポジットコントロールがあります。複合コントロールにはボタンがあります。コンポジットコントロールで使用できるボタン用のパブリックイベントハンドラがありますが、実際にはページコード内のこのイベントハンドラに直接アクセスすることはできません。私は私が私のEventHandlerをアップ配線create()
を呼び出すとき
MyControl.Create(args, new EventHandler(OnClick));
次に、ページ上の私はもちろんprotected void OnClick(object o, EventArgs args) {}
を持っているでしょう:
コントロールを表示するには、私は、例えば、次の呼び出しを行いますコンポジットコントロールのボタンクリックイベント。ここまでは順調ですね。ボタンをワイヤでクリックすると、ボタンクリックがコントロールに正常にポストバックされます。ただし、イベントはページのイベントハンドラに戻されることはありません。
私はこの問題がポストバックで発生していることを認識しています。しかし、init、load、またはcreatechildcontrolsのボタンをワイヤリングしようとすると、ワイヤリングを維持してイベントをページ上で処理できなくなります。私が望むのは、イベントハンドラを実行時にコンポジットコントロールに渡し、コンポジットコントロールがポストバック時にイベントを正しくページに返すことです。
興味深いことに、カスタムイベントタグを使用してOnBubbleを呼び出すと、ページ上でバブリングされたイベントを捕捉できます。しかし問題は私のプレースホルダがページ上にあることです。たとえば、私がMyControl.Create()
をUserControlで呼び出そうとすると、バブルはページに移動し、UserControlでは(期待通りに)移動しません。したがって、私はOnBubble
(UserControlsとMyControlを宣言する他のコントロールはボタンクリックイベントのために無用にレンダリングする)をオーバーライドするのではなく、イベントハンドラを宣言することを好む理由です。
私は誰かがこの問題についていくつかの洞察を持っていることを望んでいます。面白い問題のようですが、おそらくページ上に明示的にコントロールを宣言し、マークアップまたはページロードのいずれかで直接イベントを配線する以外の解決策はありません。ボタンを非同期コールバックにすることを検討しますが、可能であれば標準のASP.NETイベント処理を使用することをお勧めします。
ありがとうございます! 呼び出しは、複合コントロールのCreate()
メソッドを呼び出すイベントを実際に生成します。これはすべてうまくいきますが、MyControl.Create()
メソッドがコントロールに直接アクセスすることはできません。これは、コントロールがマークアップではなくページonload
に追加されているため意味をなさないはずです。
もっとコード:
MyControl : CompositeControl
{
public event EventHandler Click;
//I have a create method
void Create(args, EventHandler click)
{
this.Click = click;
//other processing
}
//then the button is wired up. I've tried in OnInit(), OnLoad()
void CreateChildControls()
{
MyButton.OnClick += Click;
}
//if I wire up the button to a default handler I can check if
Click is not null and send the click event onto the next handler
//this is where the bubble event works, but the wiring fails
}
編集:セッションでのEventHandlerを保存し、ポストバックのボタンを配線する私の試みは成功しました。私はこの良い習慣を考えていないし、実際に私の目的を果たしているとは思わない。たとえば、この場合、ページ上のイベントは期待どおりに実行されますが、非標準のページ動作をします。たとえば、Response.Redirect()は例外をスローします。イベントハンドラがポストバック中に状態情報を失っている可能性があるため、これは意味をなさないはずです。 思考のカップル: 1.それは私が何とかこのコントロールに関連しているカスタムバブルイベントを作成することができることは可能ですか?これは妥当と思われますが、ページのポストバックの問題は、バブルがどこに行かなければならないのと同じ問題を私に残します。ですから、create()を呼び出すと、バブルの宛先としてUserControlを自動的に登録することは可能でしょうか?それは難しいようです。 2.ポストバック時にデリゲートが正しく呼び出されるように、UserControlで宣言されたイベントハンドラでイベントを再配線できるページライフサイクルのポイントがありますか?これは私が紛失しているようだ。イベントハンドラはポストバックで作成されますが、OnClick中にUserControlで再作成されないため失われます。私は、明示的に物事を再作成する必要があるUserControlを望んでいないが、子コントロールがUserControlのためにそれを再作成したい。これは簡単な要求のように聞こえるが、UserControlをループから外して、私は不可能なことを求めているかもしれない。
実際にハンドラを配線するコードをいくつか追加できますか? – user134706
私はあなたがそこにイベントハンドラを格納することによってメモリをリークすると確信しています;) – user134706