- PR -

Clickイベントを破棄できますか?

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-14 21:30
引用:

uguisuさんの書き込み (2004-01-14 17:51) より:

Jittaさん、今回は、イベントそのものをキャンセルしたかったので、
イベントの中身をキャンセルするのとはちょっと趣旨が違いました・・・。
説明不足で申し訳ありません。


 LoadViewStateと、ポストデータを読み込むところでなんかやると、いけるかも。

 Webアプリの場合、「サーバで処理できるイベント」というのは基本的にないんです。なぜかというと、イベントが発生するのはクライアントだからです。クライアントから、「このコントロールの、このイベントが発生した」という情報をsubmit(提出)して初めて、サーバが処理できるのです。サーバが処理するのは、ビューステートの情報とポストデータの情報を調べて行いますから、これらの情報を読み込むところで無視するようなことをすれば、イベントハンドラに処理が移行しなくなると思います。

 あったあった。MSDNの目次から、
「VisualStudio.NET→.NET Framework→アプリケーションの構築→ASP.NET Webアプリケーションの作成→ASP.NETサーバーコントロールの開発→ポストバックイベントのキャプチャ」

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-14 22:05 ]

注意の追加
 ポストバックデータを読むメソッド(オーバーライドして実装する)は、Page_Loadイベントよりも前に発生します。だから、RaisePostBackEvent メソッド
(IPostBackEventHandler が実装されている場合)で処理する方がよいかも??

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-15 08:25 ]
uguisu
会議室デビュー日: 2004/01/14
投稿数: 6
投稿日時: 2004-01-15 10:33
Jittaさん、ありがとうございます。
早速試してみます。
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2004-01-15 21:42
引用:

uguisuさんの書き込み (2004-01-14 15:39) より:

今回は、サーバサイドでキャンセルしたいのです・・・。
なので、例えばPage_Load()などで何らかの処理を行って、
Clickイベントをキャンセルできたら良いなと考えています。


ふと思ったのですが、Click イベントを初めからハンドリングしないで
Click イベントの処理を別のメソッドに変えて、
Page_Load 内でそれを呼ぶ、というのはどうでしょうか?

#いまいちイベントのキャンセルにこだわっている理由が分からないのですが。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-16 08:50
引用:

架空兎さんの書き込み (2004-01-15 21:42) より:

ふと思ったのですが、Click イベントを初めからハンドリングしないで


 ああ、その手がありましたね。

 VB.NETの様ですが、Handles以降を消しておいて、Page_Loadの中で呼びたいときはAddHandlerする、という手がありますね。ハンドラが定義されていなければ、発生しても捨てられますから。


> #いまいちイベントのキャンセルにこだわっている理由が分からない
同じく。
uguisu
会議室デビュー日: 2004/01/14
投稿数: 6
投稿日時: 2004-01-16 09:58
架空兎さん、Jittaさん、こんにちは。

引用:

#いまいちイベントのキャンセルにこだわっている理由が分からないのですが。。。


そうですよね・・・。

そもそも、ブラウザの更新ボタン(F5)を押された時の動きとして、
一つ前のPOSTが再送されるという問題を抱えていました。
例えば、

1回目:ボタンクリック時の動き
 ・ Page_Load()
 ・ Button1_Click()

2回目:更新ボタン(F5)押下時の動き(1回目と同様の動き)
 ・ Page_Load()
 ・ Button1_Click()

と更新ボタン(F5)を押すと、前回の動きをもう一度繰り返してしまうので、
更新ボタン押下の場合は何もさせたくないというのが、やりたいことでした。

F5が押されたかどうかの判別を、
Clickイベント内に書けばいいのですが、
もう既に作られてしまったプログラムを修正する方法としては、
可能であればPage_Load()などで破棄するのが適切かと考えていました。

そのため、Clickイベントが発生する前にClickイベントをキャンセルしたい
という質問ができてしまったのです。

最初からこのような質問をすればよかったですね・・・。
申し訳ありません。
タマ(ω・ミэ )Э
会議室デビュー日: 2003/02/28
投稿数: 5
投稿日時: 2004-01-19 18:22
もしdocument.keyDownを使っていないのであれば、ページのロードもしくは、
プリレンダーで、 Response.write をつかって下のスクリプトを書いちゃえばいいと
思いますよ。

 (下記をStringに手動で直してください。)

<script>
function f5Cancel() {
if(event.keyCode == 116){
event.keyCode = 0;
return false;
}
}
document.onkeydown = f5Cancel;
</script>


もし、すべてのページ、同じクラスを継承しているんなら話は早いと思います。

protected override void OnPreRender(EventArgs e)
{
base.Response.Write("さっきのスクリプト");
base.OnPreRender(e);
}

 ってやれば、全ページに設定できるとおもいます。
 ソースがC#ですみません。

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