LinkButton
ページのどちらがクリックされたかを確認するにはどうすればよいですかPage_Load
。これは、サービスの呼び出しを回避して、そのイベントに存在するもののみを実行するためです。
6 に答える
で実行する必要があるのは、すべてPage_Load
のリクエストで常に発生させたいコード、またはポストバックチェックでラップされたときにのみ実行したいコードだけです。例えば:
protected void Page_Load(object sender, EventArgs e)
{
// Put the all code you need to run with EVERY request here
// Then add a post back check for any code you want to ONLY run on the very
// first request to the page.
if (!IsPostBack)
{
// Code you only want to run the first time. Usually setup code to initalize
// DropDownLists, Grids or pre populate a form, etc...
}
}
LinkButton
コードは、クリックハンドラー内ですべて独自のものである必要があります。
protected void yourLinkButton_Click(object sender, EventArgs e)
{
// code you want to execute when your button is clicked. This will run AFTER
// the Page_Load has finished.
}
ここで、LinkButton
を使用する場合GridView
、Repeater
またはそれを入力するためにバインディングを必要とするある種のコントロールで使用する場合は、どちらが押さRowCommand
れているかを把握するためにイベントハンドラーを実装する必要があります。LinkButton
データをそのプロパティにバインドしてCommandArgument
、一意の行固有のデータを偶数ハンドラーに渡すこともできます。
LinkButton
すべてがまったく同じハンドラーを使用している場合、最悪のシナリオは、をキャストしてから値sender
を比較するID
ことです。
protected void yourLinkButton_Click(object sender, EventArgs e)
{
LinkButton btn = (LinkButton)(sender);
if (btn.ID.Equals("Some control name you want to compare"))
{
// do something
}
}
私があなたの質問のマークから外れている場合は、コメントを残してください。私はそれを整理しようとします。
編集:あなたのコメントに基づいて、他のいくつかの制約Button
のためにそれがどれにあるかを知る必要があるように思えます。Page_Load
まあ、それを行うためのきれいな方法はありませんが、それは行うPage_Load
ことができます。Request.Form
キーをチェックし、特定のボタン名をチェックする必要があります(Button
クリックされたものだけがキーに含まれる必要があります)。例えば:
if (Request.Form.AllKeys.Contains("yourButton1"))
{
// then do something based on yourButton1
}
else if (Request.Form.AllKeys.Contains("yourButton2"))
{
// then do something based on yourButton2
}
// etc...
私はそれを回避する他のクリーンな方法はないと思います。sender
フレームワークに、プロパティの1つにポストバックを引き起こすコントロールが含まれていれば良かったでしょう。
別の編集:これは完全に私の心を滑らせました。Button
上記の編集は、データが入力されていないため、行う必要がありました__EVENTTARGET
。を使用しているのでLinkButton
、以下を使用して、ポストバックの原因となったコントロールを取得できます。
string controlNameThatCausedPostBack = Request.Form["__EVENTTARGET"];
私はこれをaでテストしましたがLinkButton
、期待どおりに機能します。
それが最終的にあなたの問題を解決することを願っています:)
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID)
{
// LinkButton1 was clicked
}
}
イベントハンドラでは遅すぎたので、私はこれをしなければなりませんでした。JavaScript を使用して、クリックされたボタンの ID を隠しフィールドに書き込むことができます。Page_Loadで取得できます。他の方法は、私の記憶が正しければ、_EVENTTARGET 隠しフィールドを調べることです。
ここに移動するには個別のハンドラーを使用しますが、各ボタンに一意のItemCommand
プロパティを指定し、必要に応じてそれらをフィルター処理することができます。
ページで他のポストバック イベントが発生したときに Page_Load コードが実行されないようにしようとしているということですか? その場合は、次のようにラップします。
if (!IsPostBack)
(私見ですが、これは WebForms イベント モデルによって必要とされるちょっとしたハックですが、実際にはそうなっています。)
それとも私はあなたの質問を誤解していますか?
特定の LinkButton を識別するには、CommandName パラメータを使用できます。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx
また、タイプ LinkButton (または Control など) の変数を宣言し、クリック イベントで自分自身への参照を使用してボタンを更新し、Load で値をチェックすることもできます。