これが発生する理由は十分にわかっています。基本的に、コントロールがページのライフサイクルで動的に作成するのが遅すぎて、イベント ワイヤアップ システムがそれを認識できないのですが、どうすればよいかはよくわかりません。
カスタム フォーラムのフォーラム投稿を表示する ListView があります。一部の投稿には添付ファイルがあります。アタッチメントは ItemDataBound イベント中にレンダリングされます。アイテムのコンテンツが asp PlaceHolder で検索され、ImageButton が動的に作成されてプレースホルダーに追加されます。
ImageButton ib_Delete = new ImageButton();
ib_Delete.ID = "ib_DeleteAttachment_" + myfile.Id.ToString();
ib_Delete.ImageUrl = "~/images/icons/delete.png";
ib_Delete.Width = 16;
ib_Delete.Height = 16;
ib_Delete.CssClass = "attachmentDeleteButton";
ib_Delete.OnClientClick = "return ConfirmDeleteAttachment();";
ib_Delete.CommandArgument = mf.Id.ToString() + '@' + m.Id;
ib_Delete.Click += new ImageClickEventHandler(DeleteMessageAttachment_Click);
myPlaceHolder.Controls.Add(ib_Delete);
現在、.cs の DeleteMessageAttachment_Click メソッドは決して起動せず、実際に JavaScript の onclick は次のようになります。
onclick="return ConfirmDeleteAttachment();"
私は実際に、同じプロジェクト内の別のページから ImageButton 作成コードをコピーしました。このページには、データバインディング関連のイベントでImageButtonsがレンダリングされていません。クライアント側のコードは次のようになります。
onclick="return ConfirmDeleteAttachment();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ctl00$cphPage$MC2$ib_DeleteAttachment_12345", "", true, "", "", false, false))"
..ページのライフサイクルの間違った時点でコントロールを作成しているため、問題があると確信していますが、適切なタイミングでそれを行うにはどうすればよいですか? Page_Load で ImageButton のロードを事前に作成し、それらをクラス全体の Dictionary<> に保持して、適切なタイミングで引き出せるようにする必要がありますか? これを行った場合、イベント ワイヤアップ システムはそれらを認識しますか? 別のときに使用できるように、適切なタイミングで作成されるようにするために人々が何をしているのかわかりません..
皆さんありがとう