- - PR -
TextBoxにデータを入力後、発生するイベントは?
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-12 21:43
なぜ、検索できなかったのかを考察してみる。
「TextBox」も含めた方がいい、というのは別として、「入力」というのが様々な意味を持っているため、というのがあるでしょう。 ここで「入力」とは、TextBox.Text の値が変わるようなもののことを指していると思われます。また、「入力確定後(Enter キー後)」ということからも、ユーザが値を変更させることを「入力」としていると思われます。 ところで、「入力」とは、何でしょう?何らかの「物体(Object)」に対して、何らかのデータを与えること、ですよね。では、キーボードのキーを押すことは、コンピュータに対して何らかのデータを入力していることにならないでしょうか?事実、「キー入力」という言葉を使います。 したがってここは、「入力」を、特定のコントロールに対して「ユーザが値を変更する行為」のみに絞った意味でとらえていたことが問題であったと言えそうです。つまり、想定している範囲に対して、より広い意味を持っていたため、ノイズが多くて絞りきれなかった、ということですかね。 Enter と Leave イベントを調べたというのは、それぞれ「コントロールが入力されると発生します。」、「入力フォーカスがコントロールを離れると発生します。」という説明が出てくるでしょう。ここで、単純に「入力」という語に反応してしまった、ということでしょうか。MSDN ライブラリで内容を確認していれば、
のような説明がありますので、目的のものではないとわかったのではないかと思います。 11月24日の「わんくま同盟 大阪勉強会 #15<wankuma.com>」にて、「MSDN Library 活用方法」というタイトルで、お話をさせていただきます。神奈川県ということで、参加されるのは無理と思いますが、2週間ほど後に資料が公開されますので、目を通してみて下さい。 (こんな感じで用意してます→「MSDN Library の...」<wankuma.com>) | ||||||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||||||
|
投稿日時: 2007-11-13 14:03
そうです。 そのような動きをするときはそのアプリケーションにそのような実装が書かれているということ。
然り。
ここでいうButtonはButtonコントロールです。
無効が何を意味しているかわかりませんが、Returnを判断すればよいでしょう。 2番に関係しますが、Control.CausesValidationを調べてみるとよいでしょう。 それを使うなら4番の処理は次の項目.Focus()だけになります。 閲覧者の方のために確認ですが、 Enterでフォーカスが移る という機能を今から作るということでよいのでしょうか? | ||||||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||||||
|
投稿日時: 2007-11-13 15:44
注意: この展開が飲み込めていません。
無効化する、いや無効化しなければならない理論が未だに理解できていませんが、
KeyPreview が出現するということは Form の KeyDown イベントということですね。 イベントのシグネチャが書かれていないので断定はできませんが。
普通に Leave イベントや Validating イベントで良いですよね。 [Enter] キーでフォーカスを移動させるなら、KeyDown イベントで、
は必要ないという理屈はわかりますでしょうか? フォーカスが移動しているわけです。 フォーカスが移動するとどんなイベントが発生すると思いますか? Leave イベント、Validating イベントが発生しますよね。
入力している最中に桁数が視界からずれてしまうのはアクセシビリティが良くない画面設計だと思います。 そういったマスク的な入力は MaskedTextBox コントロールを使うようにして固定長なイメージにするべきだと思います。 どうしても TextBox コントロールで実装するとすれば、Leave イベントなどフォーカスが外れた段階で Formatting した方がマシだと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-11-13 20:58
とりあえず、お礼はいりません。 お礼を言ってもらいたくて発言した訳では無いですし、そもそもお礼を言われる事を自分は一切していません、自分はただ単にまどかさんの発言を復唱しただけに過ぎません。 今回の件はほぼ無事解決に向かったようなので、ひとまずはおめでとうございます。 自分が前回の発言で言いたかった事は、スレを進めているうちに詰まったり解らなくなった場合、スレの頭に立ち戻り多くの人からもらっているアドバイスを読み返す事をして欲しいという事です。 少々きつい事を言わせてもらいますと、だんじりさんは130もの発言をする程熱心に質問にこられておりますが、この今までもらったアドバイスを読み返すと言う部分に欠けていると思います。 このスレに限らず、スレ内でもらっているアドバイスを読み直す事で、追加質問をしなくても十分に情報が出揃っている事が今まで多々あったと思います。 アドバイスをもらった直後にはそのアドバイスの意味を理解できなかったかもしれません、しかしスレを進めてある程度の理解をした後に最初のアドバイスを読み返す事で新たに気がつく事も多々あると思います。 そして、今までに気がつけなかった事に気がつけたなら、
と言った事も気づく事ができ、それに気がつけば回答者が何故貴方の質問に対して情報提示の為の質問を行っているのかも気がつくのではないでしょうか? そして、それを理解した上で再度アドバイスを読み直せば、色々な事が学ぶ事ができると思います。 このように、アドバイスを時間を置いて何度も読み直すと言う行為は非常に重要で得る事が多いものだと思います。 最後にもう一度言いますが、 自分の前回の発言は、まどかさんの発言を復唱しただけに過ぎません。 そしてその復唱から答えの道筋が見えたのだとしたのであれば、それはこのスレの中に、既に答えへの道が存在していたと言う事です | ||||||||||||||||||||
|
投稿日時: 2007-11-14 07:05
予習と復習
結局、一生勉強なんだな┐(´〜`)┌ | ||||||||||||||||||||
|
投稿日時: 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 ] |