C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VB.net FocusとLeaveについて

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■92113 / inTopicNo.1)  VB.net FocusとLeaveについて
  
□投稿者/ 井上 (1回)-(2019/08/27(Tue) 20:27:13)

分類:[VB.NET/VB2005 以降] 

初心者です。初めて質問させていただきます。

私は、Visual Studio Professional 2017 を使用しています。

【質問内容】
コンボボックスにフォーカス設定し、初期値0が表示されたテキストに、1から99の値を手入力で変更した場合のイベント発生についてです。

理想としては、「テキストの値変更→TextChangedイベント発生→フォーカスアウト→Leaveイベント発生」なのですが、
値を変更すると、「テキストの値変更→フォーカスアウト→Leaveイベント発生」となり、TextChangedイベントが発生しません。

原因は、値を変更した際にフォーカスアウトしてしまうためTextChangedイベントではなく、Leaveイベントが発生すると考えたのですが、
フォーカスアウトせずに、TextChangedイベントを発生させることは不可能でしょうか?

また、他に良いアイデアがあればご教授していただけないでしょうか?

分かりにくい内容で申し訳ございませんが、よろしくお願いいたします。
引用返信 編集キー/
■92116 / inTopicNo.2)  Re[1]: VB.net FocusとLeaveについて
□投稿者/ 大谷刑部 (7回)-(2019/08/28(Wed) 09:55:39)
No92113 (井上 さん) に返信
> 初心者です。初めて質問させていただきます。
>
> 私は、Visual Studio Professional 2017 を使用しています。
>
> 【質問内容】
> コンボボックスにフォーカス設定し、初期値0が表示されたテキストに、1から99の値を手入力で変更した場合のイベント発生についてです。
>
> 理想としては、「テキストの値変更→TextChangedイベント発生→フォーカスアウト→Leaveイベント発生」なのですが、
> 値を変更すると、「テキストの値変更→フォーカスアウト→Leaveイベント発生」となり、TextChangedイベントが発生しません。
TextChangedイベントはテキストプロパティーの値が変わったら発生するものなので、LostFocusやLeaveと連動して発生するものじゃありません。

> 原因は、値を変更した際にフォーカスアウトしてしまうためTextChangedイベントではなく、Leaveイベントが発生すると考えたのですが、
> フォーカスアウトせずに、TextChangedイベントを発生させることは不可能でしょうか?
物理的には、イベントを無効すれば、多分できますが、それじゃ使い勝手かえって悪くなるでしょ?
値変わってたら、コントロール移動できないというような挙動になりかねないので。

そもそもTextChangedイベントでどんな処理をしたいのですか?
入力値の論理エラーチェック的な話ならそもそも「Change」のつくイベントでするのはお勧めしません。
だって、発生頻度が高すぎますから。

まだ、LostFocusやLeaveのほうがましです。
ただし、コマンドボタン押下時に2回チェックが走らないように注意するとかは必要ですね。

入力が1〜99まであり得るならやむを得ないですが、リストが数件ならそもそもコンボボックスで入力可にすること自体やめた方がいいようなーーー。
VB6の時代からそうですが、コンボはただでさえも想定外の挙動が起きやすいうえ入力可にすることにより、
テキストボックスと同じ挙動も気にしなきゃならなくなるので、入力不可(選択のみ可)にする方が一般的な気がします。
引用返信 編集キー/
■92117 / inTopicNo.3)  Re[1]: VB.net FocusとLeaveについて
□投稿者/ 魔界の仮面弁士 (2327回)-(2019/08/28(Wed) 10:05:40)
No92113 (井上 さん) に返信
> コンボボックスにフォーカス設定し、初期値0が表示されたテキストに、
> 1から99の値を手入力で変更した場合のイベント発生についてです。

Windows Form アプリケーションでしょうか。
ComboBox には 3 種のスタイルがありますが、どれのことでしょう?

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
 'ComboBox1.Items.Clear()
 ComboBox1.DataSource = Enumerable.Range(1, 99).ToArray()
 ComboBox1.SelectedIndex = -1

 ComboBox2.DropDownStyle = ComboBoxStyle.DropDown
 'ComboBox2.Items.Clear()
 ComboBox2.DataSource = Enumerable.Range(1, 99).ToArray()
 ComboBox2.SelectedIndex = -1
 
 ComboBox3.DropDownStyle = ComboBoxStyle.Simple
 ComboBox3.Height = 180
 'ComboBox3.Items.Clear()
 ComboBox3.DataSource = Enumerable.Range(1, 99).ToArray()
 ComboBox3.SelectedIndex = -1
End Sub


> 理想としては、「テキストの値変更→TextChangedイベント発生→フォーカスアウト→Leaveイベント発生」なのですが、
> 値を変更すると、「テキストの値変更→フォーカスアウト→Leaveイベント発生」となり、TextChangedイベントが発生しません。

上記の ComboBox2 や ComboBox3 にフォーカスがある状態(テキストが空)で、
キーボードから [Num1][Num2][Num3][Tab] と入力したところ、当方環境では
 TextUpdate
 TextChanged
 TextUpdate
 TextChanged
 TextUpdate
 TextChanged
 Leave
の順でイベントが発生しましたよ。※IMEはオフの状態
テキスト部に直接入力するのではなく、リストから選ぶだけの場合には、
TextUpdate は発生せず、TextChanged だけになりますね。


> 原因は、値を変更した際にフォーカスアウトしてしまうため
> TextChangedイベントではなく、Leaveイベントが発生すると考えたのですが、

「値を変更した際にフォーカスアウトしてしまう」事象は経験したことがありません…。


TextChanged イベントが使われるのは、テキスト部に自由な文字列を入れられる、
DropDown スタイルや Simple スタイルの場合に限られます。これらのスタイルでは、
テキスト部イベント(TextUpdate / TextChanged)と
選択リストイベント(SelectionChangeCommitted / SelectedValueChanged / SelectedIndexChanged)
の両方が使われますし、Text プロパティと Selected何某プロパティは、明確に使い分けされます。



一方 DropDownList スタイルの場合は、そもそもテキストボックス部が無いため、
選択リストイベント(SelectionChangeCommitted / SelectedValueChanged / SelectedIndexChanged)
のみが使われます。そもそも TextUpdate は発生すらしないようなので、
テキスト部イベント(TextUpdate / TextChanged)と
の出番は無いでしょう。
一応 DropDownList スタイルであっても、TextChanged なら発生することもありますが、
手順によっては発生しないパターンもありますので、これに頼ることはほぼ無いはずです。
(マウス操作かキーボード操作か、ドロップダウンを伴うかどうかなどで変わる)

たとえば
 ComboBox1_SelectionChangeCommitted
 ComboBox1_TextChanged ★
 ComboBox1_SelectedValueChanged
 ComboBox1_SelectedIndexChanged
 ComboBox1_Leave
 ComboBox1_Validating
 ComboBox1_Validated
の順で発生することもあれば、TextChanged なしで
 ComboBox1_SelectionChangeCommitted
 ComboBox1_SelectedValueChanged
 ComboBox1_SelectedIndexChanged
 ComboBox1_Leave
 ComboBox1_Validating
 ComboBox1_Validated
となることもあれば、
 ComboBox1_SelectedValueChanged
 ComboBox1_SelectedIndexChanged
 ComboBox1_Leave
 ComboBox1_Validating
 ComboBox1_Validated
 ComboBox1_TextChanged ★
となることもありますね。


> また、他に良いアイデアがあればご教授していただけないでしょうか?
そもそも何のために TextChanged を使用しようとしているのでしょうか。
何故 Leave の後だと都合が悪いのかという理由も分からないので、
今のままでは改善案の出しようがありません。(^_^;)
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ