- PR -

Leave イベントが発生しない?.NETの仕様?

投稿者投稿内容
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-02 22:59
業務系のアプリを作成していると、数値を入力するテキストボックスで、
フォーカス取得時(Enterイベント時)にカンマ編集解除、
フォーカス喪失時(Leaveイベント時)にカンマ編集なんて事を良くやると思います。
(その他に、テキストボックスの背景色を変えるとか)
この動きをやっていて気づいたのですが、状況によっては Leaveイベントが発生せず、
カンマ編集されないままフォーカスが離れるときがあります。

例えば(分かりにくいかも知れませんが)、
textBox1 と textBox2があり、最初に textBox1 にフォーカスがあるとします。
その後、textBox2 にフォーカスが移動したとき(Enterイベント時)に、
textBox1 が未入力ならメッセージボックスで警告を表示し、
textBox1 へフォーカスを戻すという処理を行っています。
この時のイベントの発生順を調べたところ、
下記の様になり、textBox2 の Leaveイベントが発生しません。
8 と 9 の間で発生して欲しいなぁと思うのですが。
(12 と 13 の動きも、不可解ですが・・・・)
# ちなみに、VS2005 で確認しています

1. textBox1 Enter
2. textBox1 GotFocus
3. textBox1 Leave
4. textBox1 Validating
5. textBox1 Validated
6. textBox2 Enter <- ここで MessageBox.Show (その時点で次の 7 まで発生)
7. textBox1 LostFocus
8. textBox2 GotFocus <- MessageBox が消えると、8 以降が発生
9. textBox2 LostFocus
10. textBox1 Enter
11. textBox1 GotFocus
12. textBox1 Leave
13. textBox1 Enter

実際には、カンマ編集処理はユーザーコントロールで実現していますが、
Leaveイベントを使用している限りは、この現象はやはり起きます。
(なるべく避けたいですが、LostFocus イベントの使用も検討してます)

私の場合、入力値の妥当性チェックは Validatedイベントで、
必須入力系のチェックは Enterイベント時に専用の関数を呼んで
チェックする仕組みをとっています。
(マウスを使われると、どこにフォーカスを飛ばされるか特定できませんから・・・・)

これは、バグといえるのか、.NETの仕様といえるのか、
(Microsoft 的には仕様と判断されそうな気がしますが・・・・)
もしくは、作成手法的な改善のアドバイスなど、
皆さんの見解を聞かせて頂けませんか?

# Delphi なんかは、この辺りのイベント発生がしっかりしていた印象を受けましたが、
# Microsoft 系の言語は、どうもイベントの発生が少し曖昧な印象を受けます。
# とはいっても、.NET は個人的に今一番お気に入りの開発環境ですが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-02 23:12
引用:

じょんのびさんの書き込み (2006-03-02 22:59) より:

フォーカス取得時(Enterイベント時)にカンマ編集解除、
フォーカス喪失時(Leaveイベント時)にカンマ編集なんて事を良くやると思います。


書式の整形なので、これは良いです。

引用:

その後、textBox2 にフォーカスが移動したとき(Enterイベント時)に、
textBox1 が未入力ならメッセージボックスで警告を表示し、
textBox1 へフォーカスを戻すという処理を行っています。


これは不適切です。
書式の整形ではなく検証なのですから Validating イベントでやるべきです。

引用:

下記の様になり、textBox2 の Leaveイベントが発生しません。


MessageBox はこの他、PerformClick のメッセージもスルーしたりと、
こういったシビアな状況では使えないものだと思ってください。

引用:

私の場合、入力値の妥当性チェックは Validatedイベントで、
必須入力系のチェックは Enterイベント時に専用の関数を呼んで
チェックする仕組みをとっています。
(マウスを使われると、どこにフォーカスを飛ばされるか特定できませんから・・・・)


CauseValidation プロパティの値を気にしているのでしょうか?
Validating イベントならば、動的にチェックすべきフィールドに
フォーカス遷移しているかどうかをチェックできます。

私は MessageBox が表示されるようなチェックは最後にやるようにします。
ひとつのフィールドに出入りするだけで MessageBox が表示されるのは、
ユーザビリティの低下に繋がりますので、"現場の" オペレータからも鬱陶しがられます。

未入力チェックなどをその場でチェックする場合は、
MessageBox ではなく、赤い (*) 表示をしたり ErrorProvider を使ったりします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-02 23:53
なぜ、Enterイベントでの必須入力系のチェックをしているかといいますと、
例えば、3つのテキストボックスが配置されているフォームがあるとして、
2番目のテキストボックスの入力値によって、
3番目のテキストボックスの入力できる(すべき)値や内容が影響を受けたり、
または、3番目の入力自体が必要かどうかが影響を受ける様な場合に、
2番目の入力を優先してもらう必要があります。
2番目の入力をすっ飛ばして、3番目にフォーカスされた際に、
即座にユーザーにその事を知らせた方が親切だと考えているからなんです。

ただ、この様な項目が沢山あると、
じゃんぬねっとさんのご指摘の通り、鬱陶しいという事になるのですが、
この様な項目は、20〜30の入力項目があるフォームで、
平均的に見て数項目程度だと思います。
その他の必須項目(即座にユーザーに通知する必要がない必須項目)は、
登録時に警告を促す様にしています。

引用:

未入力チェックなどをその場でチェックする場合は、
MessageBox ではなく、赤い (*) 表示をしたり ErrorProvider を使ったりします。


この様なご意見は、大変参考になります。
今まで、ずっと上記の考え方でやってきたので、
少し頭を柔らかくして、もう一度ユーザビリティについて
考えてみるのもいいなぁと思わされました。
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-03 00:35
ErrorProvider 試してみましたけど、いいですねぇ。
見た目もかっこいいです。

エラーメッセージが、マウスカーソルを合わせなくても
表示されてくれると、もっといいんですけど。

これ使えそうです。
メッセージボックスを表示するより目新しいし、
オペレーションを途切れさせないし、活用してみたいと思いました。
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-03 01:04
自己レスです。

Enterイベントで、他へフォーカス移動させる事自体がタブーの様で、
メッセージボックスを表示させなくても、
Leaveイベントは、発生してくれませんでした。

よくよく考えてみると、Enterイベントでフォーカス移動は、
漠然とですが良くない雰囲気はしますね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 01:14
引用:

じょんのびさんの書き込み (2006-03-02 23:53) より:

2番目の入力をすっ飛ばして、3番目にフォーカスされた際に、
即座にユーザーにその事を知らせた方が親切だと考えているからなんです。


なるほど、Validating イベントで遷移しようとしているフィールドは取得できるが、
いつどこからフォーカスが移るかわからないため、全部のイベントに実装せねばならないため、
非常に都合が悪い (コードの可読性・冗長など) ということですね。

こういうのは Form 側が監視した方が良さそうですね。
ただ、いずれにしても Windows 標準の GUI を逸脱している仕様なので、やっぱり違和感を感じます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 01:17
引用:

じょんのびさんの書き込み (2006-03-03 00:35) より:

ErrorProvider 試してみましたけど、いいですねぇ。
見た目もかっこいいです。
エラーメッセージが、マウスカーソルを合わせなくても
表示されてくれると、もっといいんですけど。


これについては、こちらと同じ流れになりそうですね。

  ErrorProvider について

長い目で見るとという話になるので、ポップアップ系の UI と切り替えできると無難です。

提案してみる価値はあると思いますよ。
私もお客さんにいつも「現場の声も聞いた方が良い」と薦めています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-03 01:49
このスレッドを立てた事で、これまでに築いてきたプログラムの基本構造や、
ユーザビリティの考え方には、まだまだ改善の余地がある事を再認識できました。
特にユーザビリティに関して、関心を深めるきっかけになりました。

思わぬ収穫が得られて大変嬉しい限りです。

じゃんぬさんには、大変感謝です。有難うございます。

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