- PR -

TextBoxにデータを入力後、発生するイベントは?

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-12 21:43
なぜ、検索できなかったのかを考察してみる。

引用:

「入力後」「イベント」で過去ログを探しても見つかりませんので質問します。


 「TextBox」も含めた方がいい、というのは別として、「入力」というのが様々な意味を持っているため、というのがあるでしょう。
 ここで「入力」とは、TextBox.Text の値が変わるようなもののことを指していると思われます。また、「入力確定後(Enter キー後)」ということからも、ユーザが値を変更させることを「入力」としていると思われます。

 ところで、「入力」とは、何でしょう?何らかの「物体(Object)」に対して、何らかのデータを与えること、ですよね。では、キーボードのキーを押すことは、コンピュータに対して何らかのデータを入力していることにならないでしょうか?事実、「キー入力」という言葉を使います。
 したがってここは、「入力」を、特定のコントロールに対して「ユーザが値を変更する行為」のみに絞った意味でとらえていたことが問題であったと言えそうです。つまり、想定している範囲に対して、より広い意味を持っていたため、ノイズが多くて絞りきれなかった、ということですかね。

 Enter と Leave イベントを調べたというのは、それぞれ「コントロールが入力されると発生します。」、「入力フォーカスがコントロールを離れると発生します。」という説明が出てくるでしょう。ここで、単純に「入力」という語に反応してしまった、ということでしょうか。MSDN ライブラリで内容を確認していれば、
引用:

キーボード (Tab、Shift + Tab など) を使用するか、Select メソッドまたは SelectNextControl メソッドを呼び出すか、ContainerControl.ActiveControl プロパティを現在のフォームに設定してフォーカスを変更するとき、次の順序でフォーカス イベントが発生します。

マウスを使用するか Focus メソッドを呼び出してフォーカスを変更するとき、フォーカス イベントは次の順序で発生します。


のような説明がありますので、目的のものではないとわかったのではないかと思います。


 11月24日の「わんくま同盟 大阪勉強会 #15<wankuma.com>」にて、「MSDN Library 活用方法」というタイトルで、お話をさせていただきます。神奈川県ということで、参加されるのは無理と思いますが、2週間ほど後に資料が公開されますので、目を通してみて下さい。
(こんな感じで用意してます→「MSDN Library の...」<wankuma.com>)
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-13 13:40
RUNさん、ご親切にありがとうございます。
RUNさんのご指摘を見て、最初から何回も読んでみました。確かに私の質問にも具体性が
かけていて、伝わりにくい部分のあったようです。例えば「入力用テキストボックス
で、入力確定後(Enterキー後)に、ある処理を行いたく・・・」などは誕生日を入力すると横に配置したLabelに年齢の表示や金額を入力すると消費税額を算出して表示するな
どです。

ただ皆さんからいただいた解答は、答えを導き出すのに私にとって、あまりのも遠く
昨夜は悲しくて、悔しくてプログラム開発に対する意欲がなくなってしまいました。
そしてRUNさんに対するお礼の送信が遅くなってしまい申し訳ありませんでした。
しかしRUNさんのご指摘いただいたヒントと「KeyDown時のEnterキーの取得」について
(DOBON.NETプログラミング掲示板過去ログより→ http://dobon.net/vb/bbs/log3-9/5184.html
により、再チャレンジしています。

現在ぼんやりと分ったことは
1.[Enter]キーを押してもAccessのようにTabIndex等を設定してもフォーカスは移動しないこと。
2.よってフォーカス喪失時に発生するLeave やValidating イベントは[Enter]キー
を押しても発生しないこと。
3.AcceptButtonプロパティはフォーム上のボタンを設定するプロパティで[Tab]キーをダイレクトに設定できないこと。
4.KeyDown イベントで[Enter]キーを押されたときだけを取り出し、他のキーに対し
て無効にする必要があること。
5.[Enter]キーの改行コードは「e.KeyCode = System.Windows.Forms.Keys.Return 」
で取り出せそうであること。

以上のことから、TextBoxにデータを入力し[Enter]キーを押した後に発生するイベント
としてKeyDown イベントが使えそうになりました。
後でお読みになる質問者に対して、後日テスト結果を報告します。


HTMLを修正

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-13 16:12 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-11-13 14:03
引用:

1.[Enter]キーを押してもAccessのようにTabIndex等を設定してもフォーカスは移動しないこと。



そうです。
そのような動きをするときはそのアプリケーションにそのような実装が書かれているということ。

引用:

2.よってフォーカス喪失時に発生するLeave やValidating イベントは[Enter]キー
を押しても発生しないこと。



然り。

引用:

3.AcceptButtonプロパティはフォーム上のボタンを設定するプロパティで[Tab]キーをダイレクトに設定できないこと。



ここでいうButtonはButtonコントロールです。

引用:

4.KeyDown イベントで[Enter]キーを押されたときだけを取り出し、他のキーに対し
て無効にする必要があること。
5.[Enter]キーの改行コードは「e.KeyCode = System.Windows.Forms.Keys.Return 」
で取り出せそうであること。



無効が何を意味しているかわかりませんが、Returnを判断すればよいでしょう。

2番に関係しますが、Control.CausesValidationを調べてみるとよいでしょう。
それを使うなら4番の処理は次の項目.Focus()だけになります。

閲覧者の方のために確認ですが、
Enterでフォーカスが移る
という機能を今から作るということでよいのでしょうか?
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-13 15:19
TextBoxでデータを入力し、Enterキーを押した後に発生するイベントとしてKeyDown
イベントを使ったテストを報告します。該当するTextBoxのKeyDownイベントハンドラ
に次のコードを記述しました。
(前に報告しました「4.KeyDown イベントで[Enter]キー以外のキーに対して発生した
イベントを無効にする」より、[Enter]キーの改行コードを取得して判別したほうが容易)

注1:フォームのKeyPreviewプロパティ = True

If e.KeyCode = System.Windows.Forms.Keys.Return Then
=== Enterキーを押した後に実行したい処理 ===
次のtextBox.Focus()
End If

今後の課題1:TextBoxにデータを入力し、[Enter]キーを押さないでフォーカスを
マウスで移動させた場合はどのように対処するか。

今後の課題2:TextBoxにカンマ区切りや小数点を表示させるFormat 処理はTextChanged
イベントを使っていますが、この処理を今回のデータ入力後処理のKeyDownイベントに含めて次のように記述できないか。
If e.KeyCode = System.Windows.Forms.Keys.Return Then
=== Enterキーを押した後に実行したい処理 ===
Else
=== TextBoxの数字表示(カンマ区切等)のFormat処理 ===
End If
以上、参考までにテスト結果を報告しました。



TextBoxの数字表示(カンマ区切等)Format処理の具体的コードを削除しました。

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-13 16:42 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-13 15:44
注意: この展開が飲み込めていません。

引用:

だんじりさんの書き込み (2007-11-13 15:19) より:

(前に報告しました「4.KeyDown イベントで[Enter]キー以外のキーに対して発生した
イベントを無効にする」より、[Enter]キーの改行コードを取得して判別したほうが容易)


無効化する、いや無効化しなければならない理論が未だに理解できていませんが、

引用:

注1:フォームのKeyPreviewプロパティ = True

If e.KeyCode = System.Windows.Forms.Keys.Return Then
=== Enterキーを押した後に実行したい処理 ===
次のtextBox.Focus()
End If


KeyPreview が出現するということは Form の KeyDown イベントということですね。 イベントのシグネチャが書かれていないので断定はできませんが。

引用:

今後の課題1:TextBoxにデータを入力し、[Enter]キーを押さないでフォーカスを
マウスで移動させた場合はどのように対処するか。


普通に Leave イベントや Validating イベントで良いですよね。 [Enter] キーでフォーカスを移動させるなら、KeyDown イベントで、

引用:

=== Enterキーを押した後に実行したい処理 ===


は必要ないという理屈はわかりますでしょうか? フォーカスが移動しているわけです。 フォーカスが移動するとどんなイベントが発生すると思いますか? Leave イベント、Validating イベントが発生しますよね。

引用:

今後の課題2:TextBoxにカンマ区切りや小数点を表示させるFormat 処理はTextChanged
イベントを使っていますが、この処理を今回のデータ入力後処理のKeyDownイベントに含めて次のように記述できないか。


入力している最中に桁数が視界からずれてしまうのはアクセシビリティが良くない画面設計だと思います。 そういったマスク的な入力は MaskedTextBox コントロールを使うようにして固定長なイメージにするべきだと思います。

どうしても TextBox コントロールで実装するとすれば、Leave イベントなどフォーカスが外れた段階で Formatting した方がマシだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2007-11-13 20:58
引用:

だんじりさんの書き込み (2007-11-13 13:40) より:
RUNさん、ご親切にありがとうございます。


とりあえず、お礼はいりません。
お礼を言ってもらいたくて発言した訳では無いですし、そもそもお礼を言われる事を自分は一切していません、自分はただ単にまどかさんの発言を復唱しただけに過ぎません。

今回の件はほぼ無事解決に向かったようなので、ひとまずはおめでとうございます。

自分が前回の発言で言いたかった事は、スレを進めているうちに詰まったり解らなくなった場合、スレの頭に立ち戻り多くの人からもらっているアドバイスを読み返す事をして欲しいという事です。
少々きつい事を言わせてもらいますと、だんじりさんは130もの発言をする程熱心に質問にこられておりますが、この今までもらったアドバイスを読み返すと言う部分に欠けていると思います。

このスレに限らず、スレ内でもらっているアドバイスを読み直す事で、追加質問をしなくても十分に情報が出揃っている事が今まで多々あったと思います。

アドバイスをもらった直後にはそのアドバイスの意味を理解できなかったかもしれません、しかしスレを進めてある程度の理解をした後に最初のアドバイスを読み返す事で新たに気がつく事も多々あると思います。
そして、今までに気がつけなかった事に気がつけたなら、
引用:

確かに私の質問にも具体性が
かけていて、伝わりにくい部分のあったようです。


と言った事も気づく事ができ、それに気がつけば回答者が何故貴方の質問に対して情報提示の為の質問を行っているのかも気がつくのではないでしょうか?
そして、それを理解した上で再度アドバイスを読み直せば、色々な事が学ぶ事ができると思います。

このように、アドバイスを時間を置いて何度も読み直すと言う行為は非常に重要で得る事が多いものだと思います。

最後にもう一度言いますが、
自分の前回の発言は、まどかさんの発言を復唱しただけに過ぎません。
そしてその復唱から答えの道筋が見えたのだとしたのであれば、それはこのスレの中に、既に答えへの道が存在していたと言う事です
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-14 07:05
予習と復習

結局、一生勉強なんだな┐(´〜`)┌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-14 09:25
まどかさん、じゃんぬねっとさん、RUNさん、Jittaさん、ありがとうございます。

「KeyDown イベントで[Enter]キー以外のキーに対して発生したイベントを無効にする」
に関してですが、KeyDownイベントはキーを押す度にイベントが発生してしまいTextBox入力後
のイベントを取得するには[Enter]キーを押した場合のみのイベントを取得する必要がありますね。
そのためには[Enter]キー以外を無視するか、[Enter]キー後のイベントのみを取り出す方法が
あると思います。最初は[Enter]キー以外を無視する方法にチャレンジしてみました。
そのうちDOBON.NETプログラミング掲示板過去ログより→ http://dobon.net/vb/bbs/log3-9/5184.html
を見つけた次第です。

今後の課題1は、通常TextBoxに入力しEnterキーを押すと予測していますが、例外的には数字を
入力した後にEnterキーを押さず、マウスで別のTexBoxをクリックしフォーカスを移動してしまうことも
考えられます。この時「Enterキーを押した後に実行したい処理」が抜けてしまい問題と考え
今後の課題として記述しました。
(この処理には金額入力後のその時点における税額計算や誕生日入力の年齢計算などです)

今回の質問で、私の説明不足は「確定」という言葉の意味と、Enterキーの後に要望した処理内容の説明
不足でした。また、私が戸惑ったのはご指摘いただいたKeyDownイベントからEnterキーを押された
ときのイベントの取り出し方法が分らなかったことで、次のように2日間も要してしまいましたが
無事解決でき、ありがとうございました。

◎投稿日時: 2007-11-11 19:37 :というわけで、単純にKeyDownです。

●投稿日時: 2007-11-11 20:01 まどかさんに教えていただいた「KeyDown」で試して見ましたが、1文字入力毎に イベントが発生します。

◎投稿日時: 2007-11-12 05:52 :となりますと、既出のように KeyDown イベントあたりで良さそうですね。

◎投稿日時: 2007-11-12 07:42 :目的のものは、Validating イベントではないかとおもわれます

●投稿日時: 2007-11-12 09:34 :実験しますと1文字入力毎にイベントが発生し、なおかつ最後に
「Enterキー」を押すとイベントが発生します。 このことは「イベント発生毎にTextBoxの入力文字を
取得して、文字数が増えていたら イベントを無効にする」処理を追加する必要がありますね。

【続き】Jittaさんに伺いたいのですがTab移動の設定はどのようにすればいいので しょうか。
TabIndex及びTabStopを設定してもtabが動作しません。
(関連質問と考え、同じスレッドでの質問で申し訳ありません)

【追加修正】その後、tab動作はEnterキーを押すことでは動作せず、Tabキーを押すことで動作
することが分りました。EnterキーにもTabキー同様の動作をさせる設定が出来るのでしょうか。

◎投稿日時: 2007-11-12 19:54 :KeyDown イベントってのは、キーボードのいずれかのキーが押された
ときに発生するイベントで、Enterキーが押された時に【のみ】発生するイベントでは【有りません】
------このことは十分すぎるほど認識しており、だから困っていたのです。

●投稿日時: 2007-11-13 13:40 :ただ皆さんからいただいた解答は、答えを導き出すのに私にとって、
あまりのも遠く 昨夜は悲しくて、悔しくてプログラム開発に対する意欲がなくなってしまいました。
以上


修正内容:改行挿入
[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-14 09:32 ]
修正内容:改行挿入

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-14 09:36 ]

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