@aktonの答えはおそらくあなたがすべきことですが、予約を外してライフサイクルの早い段階でポストバックの原因を特定したい場合は、ポストバックデータを調べてクリックされたものを特定できます. ただし、これは、イベント処理中に実行される実際の関数/ハンドラーを提供しません。
Button
まず、 /以外のImageButton
原因でポストバックが発生した場合、コントロールの ID は になります__EVENTTARGET
。ポストバックが発生した場合、Button
ASP.NET が行う「かわいい」動作があります。他のすべてのボタンを無視して、クリックされたボタンだけがフォームに表示されるようにします。AnImageButton
は座標を送信するため、少し異なります。含めることができるユーティリティ関数:
public static Control GetPostBackControl(Page page)
{
Control postbackControlInstance = null;
string postbackControlName = page.Request.Params.Get("__EVENTTARGET");
if (postbackControlName != null && postbackControlName != string.Empty)
{
postbackControlInstance = page.FindControl(postbackControlName);
}
else
{
// handle the Button control postbacks
for (int i = 0; i < page.Request.Form.Keys.Count; i++)
{
postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
if (postbackControlInstance is System.Web.UI.WebControls.Button)
{
return postbackControlInstance;
}
}
}
// handle the ImageButton postbacks
if (postbackControlInstance == null)
{
for (int i = 0; i < page.Request.Form.Count; i++)
{
if ( (page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y")))
{
postbackControlInstance = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length-2) );
return postbackControlInstance;
}
}
}
return postbackControlInstance;
}
とはいえ、コントロール/ページをリファクタリングして実行を遅らせることができれば、@akton によって提案されたパラダイムを使用すると、コードはよりクリーンで堅牢になります。