- PR -

動的に生成したボタンのポストバック時処理

1
投稿者投稿内容
ぐっちゃ
会議室デビュー日: 2006/01/25
投稿数: 3
投稿日時: 2006-01-25 21:23
VB.NETで予約のシステムを開発しております。
DBを検索し複数のレコードをテーブル(Webサーバコントロール)を使って表示しています。
DataGridを使いたいのですが、行末のセルに条件により「予約可能」ボタンと「キャンセル待ち」ボタンと「受付終了」のテキストの3種類をそれぞれ表示しなければならないので
テーブルを使っています。
「予約可能」ボタンと「キャンセル待ち」ボタンはそれぞれ別のクリックイベントを記述しています。
また、Page_Initに動的生成ロジックを記述しています。
ここで質問ですが、初期表示で下記のような状態で表示されているとして
A 1000円 予約可能(ボタン)
B 2000円 キャンセル待ち(ボタン)
C 3000円 受付終了(テキスト)

Aの予約可能ボタンをクリックした時、条件が「予約可能」から「キャンセル待ち」に
変わっていた場合、ポストバック時に「キャンセル待ち」のクリックイベントが発生します。ポストバックの処理としては当然と思うのですが、ポストバック時にクリックしたボタンが「予約可能」か「キャンセル待ち」かを切り分ける方法はないものでしょうか?


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-25 21:44
一つ、簡単な方法としては、hidden なコントロールを用意して、そこに「予約」か「キャンセル待ち」かを入れてから送る、と言う方法がありますね。
ぐっちゃ
会議室デビュー日: 2006/01/25
投稿数: 3
投稿日時: 2006-01-26 00:39
Jittaさんありがとうございます。

すみません。もう少しご教授ください。
具体的にはhiddenなコントロールというと何になりますか?
また、予約するレコード数は可変ですのでこれも動的に生成するしかないと思うのですが?
レコード数分必要ですよね。
そうするとポストバック時に、どのコントールを見れば良いのか判断が可能でしょうか?
よろしくお願いします。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-01-26 00:45
NAL-6295

hiddenコントロールは、HtmlInputHiddenクラスです。

ちなみに、もしDataGridに変更可能なのであれば、
(無理なようであれば、これからの記述は無視してください。)
デザイン時にButtonを配置しておき、
ItemDataBound時に、各行の対象セルのButtonオブジェクトに対して、
適切なCommandNameを指定し、
ボタンが押された時は、ItemCommandイベントで
CommandNameを判断して処理する事が可能です。
表示させたくない時は、VisibleにFalseを定義すれば良いです。
そうすれば、押されたときに、どのコマンドが発行されたのかが分かるでしょう。
ぐっちゃ
会議室デビュー日: 2006/01/25
投稿数: 3
投稿日時: 2006-01-26 12:36
NAL-6295 さんありがとうございます。

HtmlInputHiddenで試してみます。

DataGridへの変更ですが、テスト工程に入っていますので難しいです。
DataGridでも可能なのですね。
今後の参考にしたいと思います。

ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-26 21:38
引用:

ぐっちゃさんの書き込み(2006-01-26 00:39)より:

また、予約するレコード数は可変ですのでこれも動的に生成するしかないと思うのですが?
レコード数分必要ですよね。
そうするとポストバック時に、どのコントールを見れば良いのか判断が可能でしょうか?


 私は22時頃か、6時頃しか書き込みが出来ません。ご容赦を。

 何も「押したボタン」を、現在の情報から「判断」する必要はないですよね。AのボタンのIDを、「A:予約」とか「A:キャンセル待ち」と作成して、それを <input type="hidden" runat="server" id="pushed"> に設定すれば、これの値を見れば何を押したか、わかりますよね。

<input type="hidden" runat="server" id="pushed">
<input type="button" id="A_reserve" onclick="beforePost(this);">
<input type="button" id="B_wcancel" onclick="beforePost(this);">
<input type="button" id="C_wcancel" onclick="beforePost(this);">
<input type="button" id="D_reserve" onclick="beforePost(this);">
<script>
function beforePost(btn) {
pushed.value = btn.id;
return true;
}
</script>

こんな感じかな?

当然、スクリプトを off にされると動作しません。また、pushed から取得される値は、期待しない値に書き換えられている(つまり攻撃される)可能性があります。ご注意を。

〆 written by Jitta on 2006/01/26
_________________
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2006-01-27 11:11
ButtonとLinkButtonのHTMLを見てみましょう。
コード:
<input type="submit" name="Button1" value="Button" id="Button1" />
<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>



Buttonでは、nameとvalueがPOSTされます。
LinkButtonでは、 _doPostBack関数内で隠しフィールド __EVENTTARGET にidが設定されます。

ということで、サーバ側でPOST変数を見れば押されたボタンが分かるはずです。
1

スキルアップ/キャリアアップ(JOB@IT)