- PR -

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

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

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

例えば、3つのテキストボックスが配置されているフォームがあるとして、
2番目のテキストボックスの入力値によって、
3番目のテキストボックスの入力できる(すべき)値や内容が影響を受けたり、
または、3番目の入力自体が必要かどうかが影響を受ける様な場合に、
2番目の入力を優先してもらう必要があります。
2番目の入力をすっ飛ばして、3番目にフォーカスされた際に、
即座にユーザーにその事を知らせた方が親切だと考えているからなんです。


 この説明では、2番目の入力は必須で、3番目は2番目の入力に従属すると考えられます。

 であるなら、2番目の Validating が成功するまで、3番目は ReadOnly または Disabled にしておけば、Enter イベントでのチェックは不要と思われますが、いかがでしょう?


 TextBox などを拡張して、
「読み書き可能 ReadOnly = false; Enabled = true」
「読み取り専用 ReadOnly = true; Enabled = true」
「使用不可 Enabled = false」
の状態を持ったコントロールを作っておくと、便利かも。。。
(読み取り専用 ComboBox は、枠を消した TextBox に置き換える)

〆 written by Jitta@わんくま同盟 on 2006/03/03
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-04 01:31
引用:

Jittaさんの書き込み (2006-03-03 23:26) より:

であるなら、2番目の Validating が成功するまで、3番目は ReadOnly または Disabled にしておけば、
Enter イベントでのチェックは不要と思われますが、いかがでしょう?


仕様的に許されるならば、ですね。
活性 / 非活性の初期値で活性が望ましい業務なのでしょう。

とにもかくにも、Enter イベントで判断というのは不適切ですね。
フォーカス遷移周りはかなりシビアなので、握りつぶされる恐れがあります。
先にも書いたように、活性 / 非活性どちらが初期値にしても Validating イベントあるいは、
UpdateDefaultButton メソッドをオーバーライドなどしてどうこうするのですが...

# こういう Windows の仕様からはずれた業務に携わりすぎたせいか、
# こういうトリッキーな回避方法だけ詳しくなっていく... orz


引用:

(読み取り専用 ComboBox は、枠を消した TextBox に置き換える)


んー、そんなことする必要はないっスね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-04 13:54
引用:

Jittaさんの書き込み(2006-03-03 23:26)より:

2番目の Validating が成功するまで、3番目は ReadOnly または Disabled にしておけば、
Enter イベントでのチェックは不要と思われますが、いかがでしょう?


その様に指摘されるかも知れないなぁと思っていました。
実際、その手法(Disabled にする)を取る事も多いです。
私が、先に挙げた例は「入力を優先すべき項目に関しては、
即座にユーザーにその事を知らせた方が親切だと考えている」が趣旨だったんです。
オペレータをそこまで信用しないのかとか、そこまでして即座に通知する必要性があるのか、
という議論にもなりそうですが、長い事このスタイルでやってきたので、
自分ではそれが当たり前という感覚を持っていました。

初めの方に書きましたが、その様な項目は、一つの画面の中でそれ程多くはない為、
ユーザーから特にクレーム等があった事はありません。
(必須入力チェックに関して、殆どの項目は登録直前にチェックしています)

ただ、ユーザビリティ的に不適切(少し厳しすぎる)かな?と感じ初めていますので、
考え方を改めた方が良さそうだと思っています。
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-03-04 14:27
引用:

じゃんぬねっとさんの書き込み(2006-03-04 01:31)より:

とにもかくにも、Enter イベントで判断というのは不適切ですね。


おっしゃる通りの様です。
他のイベントドリブン型の言語では通用していた方法だったので、
.NET の仕様上仕方ないのか?それとも不具合なのか?と疑問に思ったのですが、
Enterしておきながら、他へフォーカスを移動させるというのは、
今回のスレッドで、いろいろ考えてみたところ私自身も違和感を感じる様になりました。

また、Validationイベント内でも、移動先のコントロールを特定できるので、
今回と同様の事は、Validationイベントでも実装できました。

ただ、一つ前の書き込みと矛盾しますが、
Jittaさんに指摘された「2番目の Validating が成功するまでDisabled にしておけば」
を常にやっていれば「入力を優先すべき項目」は存在しない事になるので、
改めて考えてみると単に私の怠慢と、今までやってきた作成手法に対しての
固定観念が強かっただけの様です。

ErrorProviderで分かり易くする程度に留めて、
登録直前のチェックだけに留める方向で見直したいと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-04 17:18
引用:

じょんのびさんの書き込み (2006-03-04 14:27) より:

他のイベントドリブン型の言語では通用していた方法だったので、
.NET の仕様上仕方ないのか?それとも不具合なのか?と疑問に思ったのですが、


用意されているイベント自体は然るタイミングで駆動しています。
どちらかというと、.NET というより Windows メッセージの仕様上... というイメージです。

Delphi なんかでうまくいくのは流石といった感じです。
コンポーネント絡みであれば、Delphi の右に出る言語はないですね。

Java + Delphi (NCL を混ぜれば + VB もかな) な感じの、
C# を初めとする .NET CLR 系言語もかなり頑張ってるんですけどね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-04 21:32
引用:

じゃんぬねっとさんの書き込み(2006-03-04 01:31)より:
引用:

(読み取り専用 ComboBox は、枠を消した TextBox に置き換える)


んー、そんなことする必要はないっスね。


 普通はね。
 でも、「そこから文字列をコピーしたい」とか、「Disabled だと、灰色字に銀色なので見にくい」とか、言われるんです。。。
 なので、背景と文字の色を任意に指定できる TextBox などを作ったこともあります(C++ Builder 1.0)。



引用:

じょんのびさんの書き込み(2006-03-04 13:54)より:

オペレータをそこまで信用しないのかとか、そこまでして即座に通知する必要性があるのか、


 「人としてのオペレータ」を信用することと、「システムとしてのオペレータによる操作」を信用することは別です。オペレータの操作を信用してはいけません。
 人は必ずミスをします。ミスを未然に防げるなら、徹底的に防ぐ方向で考える方が、事が起こった後で鎮火処理をするよりマシです。

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-03-04 21:33 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-04 22:14
引用:

Jittaさんの書き込み (2006-03-04 21:32) より:

普通はね。
でも、「そこから文字列をコピーしたい」とか、「Disabled だと、灰色字に銀色なので見にくい」とか、言われるんです。。。
なので、背景と文字の色を任意に指定できる TextBox などを作ったこともあります(C++ Builder 1.0)。


「Disabled だと、灰色字に銀色なので見にくい」に関しては、もっと簡単な方法で回避できますね。

前者の「そこから文字列をコピーしたい」に関しても、
SetStyle と Key 系のメソッドをオーバーライドすることで防げます。

ですので、

引用:

(読み取り専用 ComboBox は、枠を消した TextBox に置き換える)


とする必要はないと先読みして、

  > んー、そんなことする必要はないっスね。

と書いています。

そんなこと == "TextBox に置き換える" のつもりですが、
私が想像したのは、System.Windows.Forms.TextBox そのものを、
その位置に載せて "置き換える" ということです。

ひょっとして、サブクラスである ::EditBox そのものを変えていますか?
であれば、かなり高度な話なので忘れてください。(アンマネジドになりますが)

この要望は結構多いので、私も経験していたり。
ただ、IsInputChar メソッド、ProcessDialogChar メソッドで、
Control 文字の割り振りをするのがかなり面倒だった記憶があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2006-03-05 01:09
inaです。
(本題から外れてしまうので、別スレッドにするか悩んだのですが....)
私の周りで.NET系を使用するプロジェクトでも、この要望※って毎回の様に言われてるみたいで、
 ・コンボをdisabledにするのではなく、テキストボックスで置き換える
という仕様をよくみてきました。
※コンボを(単純に)disabledにしただけでは、見づらいし文字列をコピー出来ないので嫌、どうにかして!

ですので、テキストボックスで置き換えるしか方法が無いものとばかり認識していたのですが、(やっぱりというか)出来るんですね...

早速、「その方法をみんなに教えてあげよう!」とネットで探してみたんですが、探し方が悪いようで見つけることが出来ませんでした...

検索のキーワードだけでもかまいませんので、是非ともご教示していただけないでしょうか?>じゃんぬねっと様

以上です、よろしくお願いいたします。

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