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

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

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

Re[2]: 自作のテキストボックスでのKeyDown時の動作


(過去ログ 84 を表示中)

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

■50086 / inTopicNo.1)  自作のテキストボックスでのKeyDown時の動作
  
□投稿者/ A.K (1回)-(2010/05/27(Thu) 18:08:52)

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

お世話になっております。
環境は、VB2005のSP1です。

現在、テキストボックスを継承して機能拡張したコントロール(以下、自作テキストボックス)を作成しております。
KeyDown時に、入力されている値のエラーチェックを行い、
○エラーがあったらエラーイベントを起こす
○正常処理なら、自作テキストボックスを使っているフォーム側に、KeyDownイベントを発生させる
○フォーム側では、KeyDown時にさらに固有のエラーチェックを行う。
○自作テキストボックス、固有のエラーチェックともに、エラーが起こった場合はキー入力を無効にする
という動作を想定しております。

さて、これらの動作のうち、エラーイベント・KeyDownイベントの発生は解決することができたのですが、エラー後のキー入力の無視ができず、躓いてしまっています。
というのも、エラー時にKeyDownの引数eで、e.Handled = Trueにしても、e.SuppressKeyPress = Trueにしても、画面に入力したキーが反映されてしまうからです。
どうも、エラー時にメッセージボックスを出した際にのみ起きている症状のようなのですが、回避方法がわかりません。
分かる方がいらっしゃいましたら、どうかご教示願います。

コード
(TextBox継承クラス側)
Public Class Class1
  Inherits Windows.Forms.TextBox

  '元々のKeyDownをShadowsで殺す
  Public Shadows Event KeyDown(ByVal sendder As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

  'エラー時のイベント
  Public Event Errored(ByVal sendder As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

  Private Sub Class1_KeyDown1(ByVal sendder As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

  'エラー処理

  if エラー then
    e.Handled = True
    e.SuppressKeyPress = True

    RaiseEvent Errored(sendder, e)
  else
    '正常ならKeyDownを起こす
    RaiseEvent KeyDown(sendder, e)
  End Sub
End Class

'***************************************
(Form側)
Public Class Form1

  Private Sub Class1_Errored(ByVal sendder As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Class1.Errored
    MessageBox.Show("Error") 'メッセージボックスをコメント化すると、文字コードも無視される
  End Sub

  Private Sub Class1_KeyDown(ByVal sendder As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Class1.KeyDown
    MessageBox.Show("KeyDown")
  End Sub

End Class

引用返信 編集キー/
■50090 / inTopicNo.2)  Re[1]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ chobi (6回)-(2010/05/27(Thu) 22:35:00)
> ○エラーがあったらエラーイベントを起こす

エラーとは何の事?(想定外の文字入力?)

> さて、これらの動作のうち、エラーイベント・KeyDownイベントの発生は解決することができたのですが、エラー後のキー入力の無視ができず、

入力の無視とはどういう事?
入力する前の値に書き戻すのかな
だったらGotFocusイベントでその時の値を記憶しておき、エラー?を検知した時点で
記憶した値に戻せばいいじゃないでしょうか?

引用返信 編集キー/
■50091 / inTopicNo.3)  Re[2]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ Hongliang (640回)-(2010/05/27(Thu) 23:18:48)
メッセージボックスを含めたダイアログ類は、メッセージループを回します。その結果、KeyDown のもとである WM_KEYDOWN が完了しない状態でも、次のメッセージである WM_CHAR を受け取ってしまうのです。
入力処理など連続して発生する類のイベントの途中では基本的にダイアログを表示させるべきではありません。

コピペや IME による入力なんかに対する耐性も考えれば、リアルタイムのチェックなら TextChanged で、一旦入力が完了してから最後にチェックでいいのなら Validating でやった方が良いと思います。
KeyPress イベントの方ならまだマシですが、IME 経由で入力された物は各文字列ごとに発生したりしますのでこれも警告の表示方法は考える必要があります。
引用返信 編集キー/
■50104 / inTopicNo.4)  Re[1]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ kic (2回)-(2010/05/28(Fri) 10:23:44)
2010/05/28(Fri) 10:25:08 編集(投稿者)

No50086 (A.K さん) に返信

イベントの引数にしているKeyEventArgsのKeyValueを消したいということでしょうか?

RaiseEvent Errored( sender, new KeyEventArgs(Keys.None))


引用返信 編集キー/
■50105 / inTopicNo.5)  Re[1]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ kic (3回)-(2010/05/28(Fri) 10:25:56)
2010/05/28(Fri) 10:27:22 編集(投稿者)
2010/05/28(Fri) 10:26:13 編集(投稿者)

二重になってしまったので削除


引用返信 編集キー/
■50115 / inTopicNo.6)  Re[3]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ A.K (2回)-(2010/05/28(Fri) 10:53:01)
返信ありがとうございます。参考にさせていただきます。

No50090 (chobi さん) に返信
> エラーとは何の事?(想定外の文字入力?)
言葉足らずで申し訳ありません
エラーというのは不適切でした。ここで言っているエラーとは、規定外文字入力、必須項目が未入力だった場合等、こちらで定義した「不正な入力」のことです。

> 入力の無視とはどういう事?
キー入力の無効、のことです。「0」キー入力時に不正と判定されたら、テキストボックスに「0」が反映されるのは困るから無視したいのです。


No50091 (Hongliang さん) に返信
> メッセージボックスを含めたダイアログ類は、メッセージループを回します。その結果、KeyDown のもとである WM_KEYDOWN が完了しない状態でも、次のメッセージである WM_CHAR を受け取ってしまうのです。
> 入力処理など連続して発生する類のイベントの途中では基本的にダイアログを表示させるべきではありません。
なるほどです… WM_CHARを途中で握りつぶすというのもありですね…危険なのでやりたくないですけど…
Validateだと、どういう方法であれフォーカス移動するとチェックロジックが走ってしまうのが好みに合わず、敬遠していました(w
そちらも視野に入れて検討してみたいと思います。

解決済み
引用返信 編集キー/
■50116 / inTopicNo.7)  Re[2]: 自作のテキストボックスでのKeyDown時の動作
□投稿者/ A.K (3回)-(2010/05/28(Fri) 10:57:17)
2010/05/28(Fri) 15:21:23 編集(投稿者)
2010/05/28(Fri) 15:21:19 編集(投稿者)

返信ありがとうございます。
No50104 (kic さん) に返信
> イベントの引数にしているKeyEventArgsのKeyValueを消したいということでしょうか?
>

内容については、■50115 / inTopicNo.6 で補足したとおりです。
メッセージボックスを出すと、許可していないKeyValueが表示されてしまう、という感じです。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -