- - PR -
Leave イベントが発生しない?.NETの仕様?
1|2|3|4
次のページへ»
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 は個人的に今一番お気に入りの開発環境ですが。 | ||||||||||||||||
|
投稿日時: 2006-03-02 23:12
書式の整形なので、これは良いです。
これは不適切です。 書式の整形ではなく検証なのですから Validating イベントでやるべきです。
MessageBox はこの他、PerformClick のメッセージもスルーしたりと、 こういったシビアな状況では使えないものだと思ってください。
CauseValidation プロパティの値を気にしているのでしょうか? Validating イベントならば、動的にチェックすべきフィールドに フォーカス遷移しているかどうかをチェックできます。 私は MessageBox が表示されるようなチェックは最後にやるようにします。 ひとつのフィールドに出入りするだけで MessageBox が表示されるのは、 ユーザビリティの低下に繋がりますので、"現場の" オペレータからも鬱陶しがられます。 未入力チェックなどをその場でチェックする場合は、 MessageBox ではなく、赤い (*) 表示をしたり ErrorProvider を使ったりします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-03-02 23:53
なぜ、Enterイベントでの必須入力系のチェックをしているかといいますと、
例えば、3つのテキストボックスが配置されているフォームがあるとして、 2番目のテキストボックスの入力値によって、 3番目のテキストボックスの入力できる(すべき)値や内容が影響を受けたり、 または、3番目の入力自体が必要かどうかが影響を受ける様な場合に、 2番目の入力を優先してもらう必要があります。 2番目の入力をすっ飛ばして、3番目にフォーカスされた際に、 即座にユーザーにその事を知らせた方が親切だと考えているからなんです。 ただ、この様な項目が沢山あると、 じゃんぬねっとさんのご指摘の通り、鬱陶しいという事になるのですが、 この様な項目は、20〜30の入力項目があるフォームで、 平均的に見て数項目程度だと思います。 その他の必須項目(即座にユーザーに通知する必要がない必須項目)は、 登録時に警告を促す様にしています。
この様なご意見は、大変参考になります。 今まで、ずっと上記の考え方でやってきたので、 少し頭を柔らかくして、もう一度ユーザビリティについて 考えてみるのもいいなぁと思わされました。 | ||||||||||||||||
|
投稿日時: 2006-03-03 00:35
ErrorProvider 試してみましたけど、いいですねぇ。
見た目もかっこいいです。 エラーメッセージが、マウスカーソルを合わせなくても 表示されてくれると、もっといいんですけど。 これ使えそうです。 メッセージボックスを表示するより目新しいし、 オペレーションを途切れさせないし、活用してみたいと思いました。 | ||||||||||||||||
|
投稿日時: 2006-03-03 01:04
自己レスです。
Enterイベントで、他へフォーカス移動させる事自体がタブーの様で、 メッセージボックスを表示させなくても、 Leaveイベントは、発生してくれませんでした。 よくよく考えてみると、Enterイベントでフォーカス移動は、 漠然とですが良くない雰囲気はしますね。 | ||||||||||||||||
|
投稿日時: 2006-03-03 01:14
なるほど、Validating イベントで遷移しようとしているフィールドは取得できるが、 いつどこからフォーカスが移るかわからないため、全部のイベントに実装せねばならないため、 非常に都合が悪い (コードの可読性・冗長など) ということですね。 こういうのは Form 側が監視した方が良さそうですね。 ただ、いずれにしても Windows 標準の GUI を逸脱している仕様なので、やっぱり違和感を感じます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-03-03 01:17
これについては、こちらと同じ流れになりそうですね。 ErrorProvider について 長い目で見るとという話になるので、ポップアップ系の UI と切り替えできると無難です。 提案してみる価値はあると思いますよ。 私もお客さんにいつも「現場の声も聞いた方が良い」と薦めています。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-03-03 01:49
このスレッドを立てた事で、これまでに築いてきたプログラムの基本構造や、
ユーザビリティの考え方には、まだまだ改善の余地がある事を再認識できました。 特にユーザビリティに関して、関心を深めるきっかけになりました。 思わぬ収穫が得られて大変嬉しい限りです。 じゃんぬさんには、大変感謝です。有難うございます。 |
1|2|3|4
次のページへ»