私の問題は、ASP.NETでカスタムイベントハンドラがどのように機能するかをよく理解していないと考えられます。私はいくつかの記事を読んだが、ターゲットオーディエンスは私とは異なる何かを試している。ポストバックごとにカスタムコントロールのイベントハンドラを起動させる
私は、Initイベント中に自分のページに動的に配置されるUserControlを作成しました。ポピュレートしてうまく動作しますが、ポストバック中にデータを取得する方法については頭を悩ませています。
これは事実上、クライアント側のJavaScriptを使用して完全に操作されるマルチプルコンボボックスです(私はjQueryを大量に使用しています)。コントロールコンテナ要素の中で、選択されたすべての項目を含む空のDIV要素をレンダリングします。ユーザーがアイテムを選択すると、マークアップを含むDIV内にDIVが生成されます。サーバー側の私にとって興味深いのは、2つのINPUTフィールドの内容です。
項目を選択した後、レンダリングされたHTMLのようなものになります。
<div class="multiPickContainer">
<div class="multiPickItem">
<input type="text" />
<input type="hidden" />
</div>
</div>
問題を、当然のことながら、これらの選択項目は、クライアント側で生成されたことで、サーバーは、任意の知識を持っていませんそれらは(runat = "server"はありません - 純粋なHTMLです)。
私は任意のポスト[バック]で、私はこのコンテナDIV内の要素を調べることができる私のカスタムコントロール内で発生するイベントハンドラをしたいと思います。ユーザーが選択を行ったかどうかにかかわらず、このイベントが発生するようにしたいと考えています(コントロールが事前入力されている可能性があります。その場合、選択肢が何であるかはまだわかります)。私は後だ何
は次のようなものです:
private GenerateControl(TemplateControl page){
var control = page.LoadControl("~/MyControl.ascx") as MyControl;
control.OnPostBack += HandlePostback;
}
私は完全にオフトラックすることができ、これは実際には不可能(あるいは愚かなアイデア)であってもよいです。私が考えることのできる唯一の代替案は、実際のASP.NETコントロールを送出し、ビルトインのイベントハンドラをフックすることです。
誰もが何か提案をすることができますか、カスタムイベントハンドラの作成について説明している文献を教えてください。
おかげで、YADSに表示されます。私は(私はRequest.Formから値を取得する)イベントハンドラが常に発生することを確認して残っている問題があります。私はサードパーティ製のコントロールを使用しているため、TextChangedイベントとSelectedIndexChangedイベントをトラップしていますが、いくつかのユースケースが複数のイベントをトリガする(そして、トリガしない)ために、これは醜いです。これはあなたの答えとは無関係ですが、私にとっては結びついています。フォームがポストされたときに、いつも呼び出されるイベントハンドラをどうにか強制することはできますか? –
@Stefan、 'Page_Load'でイベントハンドラを呼び出すことはできますか? – Vadim
残念ながら、私のすべてのページコントロールは(Initイベントで)動的に生成されるので、イベントハンドラを手動で呼び出すと、コントロールの新しいインスタンスに対してそのようになります。しかし、私はコントロール内にValueChangedイベントハンドラを持つHiddenFieldを追加することでこれを回避することができました。 HiddenFieldは、インタラクションの際にクライアントのJavaScriptに「触れられる」ようになり、これは確実に私のイベントハンドラを起動します。あなたの洞察に感謝します - すべてが今働いています! –