- PR -

MaskedTextBoxのキー操作無効化について

1
投稿者投稿内容
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-11 14:29
いつもお世話になっております。

今回の質問は前回教えていただいた自作日付入力コントロール
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39430&forum=7&31
のMaskedTextBox部分についてです。

キーボード入力にて値を入力する際、日付にふさわしくない数値
(例えば月部分に[13]とか) が入力された時にキーボード入力を無効にしたいのです。

そこでKeyPressイベントで押されたキーの値をチェックしようとしているのですが、
不正なキーボードを押された時にキーボード入力を無効にする事が出来ません。

チェックでエラーとなった時に e.Handled = True としているのですが
きちんとその処理が通っているにも関らず、押したキーボードの値が入力されてしまうのです。

同様の処理をTextBoxで書いた時には e.Handled = True でOKだったと思うのですが、
MaskedTextBoxでは違うように書かないといけないのでしょうか・・・・。

試しにKeyPressイベントに e.Handled = True とだけ記述して実行してみました。
本来なら何を押されても値が入力されないはずだと思うのですが・・・。
シングルステップで e.Handled = True を通っているのは確認済みです。

どうやらMaskで日付書式を指定していることが原因のようで、
Maskを指定していない状態だとちゃんと e.Handled = True が効いているようです。

Maskを指定した状態で、KeyPressイベントにて e.Handled = True を行う事は
出来ないのでしょうか・・・。

何か思い当たる点があれば、ご指摘頂ければ嬉しいです。
皆様、何卒よろしくお願い致します。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-11 15:49
MaskedTextBoxのMaskで不十分な場合、
拡張するのは結構めんどくさい作業になります。

MaskedTextProviderを継承するクラスを作成し、
そのインスタンスをMaskedTextBoxのコンストラクタで指定します。

コンストラクタで指定するので、デザイン時サポートだとうまく使えません。

デザイン時でもうまく使えるようにしたい場合は
MaskedTextBoxを継承してコンストラクタでMaskedTextProviderを
指定するようなコントロールを作るのが便利です。

追記:
上の方法はFrameworkをきっちり使う方法です。
WndProcをオーバーライドしたり、といった他の方法でも
理論上はできるはずです。
WndProcを使うと動作確認が大変なので私はやりません。

どちらにしろ、日付とか時刻入力といった部分の
細かいサポートは大変めんどくさい作業になります。

決まった形式のIDを入力する、といったタスクは結構あると思いますので
使い方を知っていてもいいかもしれませんが。


[ メッセージ編集済み 編集者: れい 編集日時 2007-07-11 15:59 ]
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-11 19:42
れいさん、ご回答ありがとうございます。
上司に「結構大変みたいなんで、お時間下さい」って言ったら、
「時間掛かるんだったら、いいや。」って事になってしまいました^^;
せっかく教えていただいたのにすみません。

ですが、れいさんのおっしゃるとおり、勉強になりそうなので、
教えていただいた事を勉強として自分でやってみようと思います。

もし、やってみてわからない事があったらまた投稿させていただきますので
その時は宜しくお願い致します。

本当に有り難うございました。今後とも宜しくお願い致します。

1

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