- PR -

TextChangedとClickイベントの同時発生について

投稿者投稿内容
GOH
会議室デビュー日: 2004/02/13
投稿数: 8
投稿日時: 2004-02-13 01:33
vb.netでwebアプリを開発しています。

過去ログを検索しましたが情報を見つけることが出来ませんでしたので
質問させてください。

TextBoxのTextChangedのイベントってフォーカスが外れた時に発生する
という認識はあってますよね?
いま困っている現象は、TextBoxへ入力後、フォーカスはそのままで
マウスでボタンをクリックした時に(この時にTextChangedとボタンの
Clickイベントって同時に発生しますよね?)
TextChangedイベントが2回発生してしまうことです。←これって常識?
しかもPostBackも2回発生します。←これも常識??

デバッグしてみるとPageLoad→TextChanged→PageLoad→TextChanged→Clickと
いう順で動いていました。
このような操作をした時に、2回目のTextChangedを(もしくはPostBack自体を)
キャンセルする方法はあるのでしょうか?

※余談ですが、
TextBoxへ入力した値をTextChangedが発生する度に、DataListを使って画面に履歴を表示して
いるのですが、この時だけはうまく表示されません。
(同時にsessionに保存している値の方にはちゃんと書き込まれています。)
この現象もイベントが2回起こるのが原因なのでしょうか?


『そんな操作はしないで下さい』って、ユーザーさんに言ったら
激しく突っ込まれてしまいまして。。。

この現象はwebアプリでは常識的なことで、コードでフラグ処理等をして
回避するしかないのでしょうか?
Webアプリに関しては、まだまだ経験値が少ないので、馬鹿な質問を
しているかもしれませんが。。。

ご存知の方、ご教授お願いします。

長文、失礼しました。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-13 08:45
引用:

GOHさんの書き込み (2004-02-13 01:33) より:

TextBoxのTextChangedのイベントってフォーカスが外れた時に発生する
という認識はあってますよね?


Webフォームで??
Windowsフォームならともかく……

TextBoxからフォーカスが抜けた程度ではTextChangedが発生しません。
TextBox.TextChanged イベント
には「テキスト ボックスの内容がサーバーへのポスト間で変更された場合に発生します。」とあります。
それとも、何かScriptを追加してますか? あるいはWindowsフォーム?

引用:

デバッグしてみるとPageLoad→TextChanged→PageLoad→TextChanged→Clickと



そもそも、WebフォームのTextBoxにClickなどというイベントは存在しないはずです。
あるのは DataBinding,Disposed,Init,Load,PreRender,TextChanged,Unload です。
(TextBox イベント参照。)
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-02-13 10:03
>GOHさん
>TextChangedイベントが2回発生してしまうことです。←これって常識?
>しかもPostBackも2回発生します。←これも常識??

常識ではないと思いますが、javascriptでボタンのonclickイベントでsubmit()とかやってませんか?
そうすると、javascriptのsubmit()とボタンクリックのサブミットで二回サブミットするかも。

>ぢゃん♪さん
>WebフォームのTextBoxにClickなどというイベントは存在しないはずです。
TextBoxのClickではなく、ButtonのClickのことを言っているのだと思います。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-13 10:07
引用:

一郎さんの書き込み (2004-02-13 10:03) より:

TextBoxのClickではなく、ButtonのClickのことを言っているのだと思います。


ああ、たしかに。早とちり
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-13 10:46
TextBoxの「AutoPostBack」プロパティを「true」に設定していると思ったのですが
こちらで試してみた所

変更してTABキーでフォーカス移動 → イベント1回
変更してEnterキーでフォーカス移動 → イベント2回
Submitボタンを押下 → イベント1回

になったので状況は違いました。

まずはどのような方法でフォーカス移動時にPostしているか教えていただけないでしょうか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-02-13 11:07
こちらで試しましたが、

TextBoxとButtonを1個ずつ配置して、TextBoxの「AutoPostBack」プロパティを
「true」にする。
実行時にTextBoxに何か入力してButtonをクリック。すると、

Page_Load(ポストバック)→TextBox_TextChanged→Page_Load(ポストバック)
→TextBox_TextChanged→Button_Click
の順でイベントが走りましたよ。

たしか、TextBoxが配置されている個数(1個か複数か)によって挙動が違ったと
思います。TextBoxが複数個配置されている場合は、ゆうじゅんさんのおっしゃっている
ようになるのだと思います。

仕様上AutoPostBackをfalseにしてよいのならそうするのがいいかもしれませんね。
無理なのならば、javascriptで何とかするか、サーバーイベントハンドラの内容を
考え直すなど、でしょうか。

ちなみにTextBoxの「AutoPostBack」プロパティを「true」にするとjavascriptが
書き込まれますのでhtmlソースを確認するとよいでしょう。
GOH
会議室デビュー日: 2004/02/13
投稿数: 8
投稿日時: 2004-02-13 13:57
返信して頂いたみなさん、
有り難う御座います。
またレスが遅くなってしまい申し訳ありません。

説明不足の質問でした(汗)
みなさんが推測されている通り、サーバーへのポスト方法は
AutoPostBackをTrueに設定し、Scriptで行っています。

べるさんがおっしゃっている通りAutoPostBackをFalseにすれば
解決する問題かもしれませんが。。。

ただ、仕様として、
1.TextBoxに値を入力
2.Enterキーで確定(Scriptでサーバーへポスト)
3.サーバーサイドで入力値チェック(DBへの存在チェック)
4.入力値の履歴をクライアントへ返す
とういうことを要求されています。
また、3の中で、履歴に表示されている値を、再度入力された場合に
『既に入力済です』というエラーメッセージも返しています。

このようなことを実現する場合は、AutoPostBackをTrueにして
毎回、サーバーへポストしてやれば良いだろうと単純に考えておりました。
(実際に1→2の操作なら想定通りの動作をしています。)

ところが
・TextBoxに値を入力
・マウスでButtonをクリック(←何故こんなことをする(怒)
と操作された時には、『既に入力済です』とエラーが表示されてしまうのです。
訳が分からずデバッグしてみると
Page_Load→TextBox_TextChanged→Page_Load→TextBox_TextChanged
→Button_Click
とイベントが発生した時の
・1回目のTextChangedイベント
入力値の重複チェック:OK→入力値の履歴を表示→sessionに値を保持
・2回目のTextChangedイベント
入力値の重複チェック:NG→エラーメッセージ表示
(※重複チェックはsessionの値との比較)
となっていました。
TextBox_TextChangedとButton_Clickで2回Submitされているので
当然といえば当然なのですが。。。

みなさん、
もしこんな要求仕様が来た時って、どのように実現しますか?
お知恵をお貸しください。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-13 14:16
前回入力値を保持しておいてTextChanged時の入力値と比較してみてはどうですか?

・1回目のTextChangedイベント
入力値をsessionに保存

・2回目のTextChangedイベント
保存してあった前回入力値と入力値が同じなので処理終了(チェックしない)

・別の入力をして発生したTextChangedイベント
保存してあった前回入力値と異なるので重複チェック

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