none
テキストボックスコントロールで、別のフォームに移る時も_Leaveを通るようにするには RRS feed

  • 質問

  • 数値入力で範囲が100以上というような場合、_Changedで値のチェックが出来ませんので、
    _Leaveでチェックし確定するようにしています。ところが、変更している最中にいきなり他の
    フォームに移る場合、_Leaveを通らず、チェックし確定することができません。
    何か対処の方法はありませんか?
    2009年7月27日 6:58

回答

  • とりあえずLostFocusイベントは発生しますので、そちらで対応できるかもしれません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク クサキ 2009年7月30日 7:05
    2009年7月27日 8:06
    モデレータ
  • LostFocus イベントは下位レベルのイベントであり、あまり推奨されていません。デザイナからイベントにハンドラを追加することはできません。コードから直接 += で追加する必要があります。
    ハンドラの追加については 方法 : Intellisense を使用してイベントをフックする (C#) が参考になるでしょう。幸い LostFocus はインテリセンスの候補で出てきます。
    ただ、推奨されてないだけあって問題もあるので、MSDN で LostFocus の注意書きをよく確認してください。

    // でも、一旦他のウィンドウに切り替えるだけで Validator が動くのはヤだなぁ。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月28日 6:01
  • また、”Intellisense を使用してイベントをフック”で作るとthrow new NotImplementedException(); が出来ます。
    あるとコンパイルエラーになるのでカットして動かしています。
    throw new NotImplementedException();はどう考えたら良いのでしょうか?

    個人的には、「ここ後で実装すべし」のリマインダー的に捉えています。
    よくプログラミングのノウハウにある、「封じ手」的な。(封じ手=明日実装すべきところをわざとコンパイルエラーが発生するじょうたいにして帰る)
    なので、ただイベントの中身を空っぽにしてビルドが通るようにしてはだめで、未実装の場合には例外を throw する状態にしておくべきかと。
    いざデバッグを開始してみたら、「あら、ここ実装してないじゃない」という事態になると悲しいので。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月29日 6:36
  • また、”Intellisense を使用してイベントをフック”で作るとthrow new NotImplementedException(); が出来ます。
    あるとコンパイルエラーになるのでカットして動かしています。
    throw new NotImplementedException();はどう考えたら良いのでしょうか?
    Not Implemented、つまり”実装されていません”を示す例外です。
    自動的にコードを挿入したのはいいが、中身の実装を忘れている人への注意みたいなものと思えば良いと思います。
    きちんとイベントハンドラ実装する時に、throw new NotImplementedException(); の行は削除して良いでしょう。


    なお、throw new NotImplementedException(); によって生じる現象はコンパイルエラーではなく、(実行時)例外と呼ばれるものです。
    この機会にでも、用語についてご確認下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月29日 14:34
    モデレータ

すべての返信

  • とりあえずLostFocusイベントは発生しますので、そちらで対応できるかもしれません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク クサキ 2009年7月30日 7:05
    2009年7月27日 8:06
    モデレータ
  • プロパティのイベントの所で、LostFocusイベントを探しましたがありません。
    FormのDeactivateで他のコントロールにフォーカスをセットしたら、Leaveを通り、
    とりあえず目的の動きはできますが、そういうことなのでしょうか?
    その場合、また元のFormに戻って来た時、Focusがそちらの方に移っていて面白くありません。

     

    2009年7月28日 5:26
  • FormのDeactivateでValidate()を呼び出して
    テキストボックスでは_Leaveの代わりに_Validatingイベントを使ったらどうでしょうか
    http://www.mahoroba.ne.jp/~mw_ken
    2009年7月28日 5:55
  • LostFocus イベントは下位レベルのイベントであり、あまり推奨されていません。デザイナからイベントにハンドラを追加することはできません。コードから直接 += で追加する必要があります。
    ハンドラの追加については 方法 : Intellisense を使用してイベントをフックする (C#) が参考になるでしょう。幸い LostFocus はインテリセンスの候補で出てきます。
    ただ、推奨されてないだけあって問題もあるので、MSDN で LostFocus の注意書きをよく確認してください。

    // でも、一旦他のウィンドウに切り替えるだけで Validator が動くのはヤだなぁ。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月28日 6:01
  • > FormのDeactivateでValidate()を呼び出して
    > テキストボックスでは_Leaveの代わりに_Validatingイベントを使ったらどうでしょうか
    Validate()が無く出来ませんでした。


    LostFocus イベントを使うことにより、思い通りの動きになりました。
    ありがとうございました。

    一応、問題は解決しましたが、以下の点もお願いします。

    > LostFocus イベントは下位レベルのイベントであり、あまり推奨されていません。
    簡単に読みましたが、良くわかりませんでした。何が問題なのでしょうか?

    また、”Intellisense を使用してイベントをフック”で作るとthrow new NotImplementedException(); が出来ます。
    あるとコンパイルエラーになるのでカットして動かしています。
    throw new NotImplementedException();はどう考えたら良いのでしょうか?

     

     

    2009年7月29日 6:21
  • また、”Intellisense を使用してイベントをフック”で作るとthrow new NotImplementedException(); が出来ます。
    あるとコンパイルエラーになるのでカットして動かしています。
    throw new NotImplementedException();はどう考えたら良いのでしょうか?

    個人的には、「ここ後で実装すべし」のリマインダー的に捉えています。
    よくプログラミングのノウハウにある、「封じ手」的な。(封じ手=明日実装すべきところをわざとコンパイルエラーが発生するじょうたいにして帰る)
    なので、ただイベントの中身を空っぽにしてビルドが通るようにしてはだめで、未実装の場合には例外を throw する状態にしておくべきかと。
    いざデバッグを開始してみたら、「あら、ここ実装してないじゃない」という事態になると悲しいので。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月29日 6:36
  • また、”Intellisense を使用してイベントをフック”で作るとthrow new NotImplementedException(); が出来ます。
    あるとコンパイルエラーになるのでカットして動かしています。
    throw new NotImplementedException();はどう考えたら良いのでしょうか?
    Not Implemented、つまり”実装されていません”を示す例外です。
    自動的にコードを挿入したのはいいが、中身の実装を忘れている人への注意みたいなものと思えば良いと思います。
    きちんとイベントハンドラ実装する時に、throw new NotImplementedException(); の行は削除して良いでしょう。


    なお、throw new NotImplementedException(); によって生じる現象はコンパイルエラーではなく、(実行時)例外と呼ばれるものです。
    この機会にでも、用語についてご確認下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク クサキ 2009年7月30日 7:06
    2009年7月29日 14:34
    モデレータ