C#での「MaskedTextBox」の関する覚書。
Formに配置した「MaskedTextBox」に16進数(HEX)以外
の文字&数字の入力を無効にする方法の覚書。
【条件】
①入力できるのは16進数(HEX)を表す「0~9」「A~F」の入力を有効にし、
それ以外は無効な入力とする。(MaskTextBox内に表示させない。)
②アルファベット「A~F」は全て大文字とし、小文字を
入力しても自動的に大文字に変換されるようにする。
Github:Sample_MaskedTextBoxToHEX
今回の覚書は「MaskedTextBox」だけに有効な手段ではありません。
普通の「TextBox」でも有効。「MaskedTextBox」を使用したのは
単純に「Mask」機能を使いたかっただけ。後は好みの問題?
目次
【1】コード全体
【2】「MaskedTextBox」の「Mask」の設定
「Mask」は「Mask要素」によって設定する。
英数字の入力を許可するには「A」か「C」を使う。
「C」は制御文字以外、「A」は英数字を表す。
今回の場合メインの入力制限をKeyDownイベントで
処理しているため、どっちでも希望とする動きはしている。
でもまぁ英数字だけなんだから「A」を使うのが妥当かな?
先頭の「>」はこれに続く全ての文字を大文字に変換するためのもの。
大文字への自動変換にこだわりがなければ不要。「>」がなくても処理に影響はない。
マスク要素の詳細は下記サイトを参照
MaskedTextBox.Mask プロパティ
【3】「KeyDown」「KeyPress」「KeyUp」イベントの発生する順番
「KeyDown」はコントロールキーを『押した時』
「KeyPress」はコントロールキーを『押している時』
「KeyUp」はコントロールキーを『押した後』
となる。よって発生順は「KeyDown」→「KeyPress」→「KeyUp」となる。
【4】入力制御「KeyDown」イベント
コントロールキーからの入力の有効・無効を判別するには
「KeyDown」イベントで入力された値を確認して「KeyPress」
イベントの発生を有効にするか無効にするで切り替える事ができる。
つまり『「KeyPress」イベントが実行される = コントロールキーの入力は有効』
となるため、今回のように入力そのものを無効にしたい(画面に表示もさせない)
という場合は「KeyDown」イベントで入力を判別しなければならない。
入力制御(if文)
if文は上から
1.アルファベットの「A」~「F」
2.キーボードから入力された数字の「0」~「9」
3.テンキーから入力された数字の「0」~「9」
4.キーボードの右(→)左(←)の入力
となる。
③と④は絶対に必要というわけではなく、操作的に
入力が有効だった方が便利なので追加している。
「KeyValue」に下記サイトの一覧表を参照
.NET 3.5 Keys 一覧
「KeyPress」イベントの有効・無効の切替
「KeyPress」イベントは「SuppressKeyPress」プロパティで切り替える。
注意が必要なのが『trueで無効』『falseで有効』という点。
「有効 = true / 無効 = false」というのが染み付いているせいか
どうもしっくりこない・・・。これって俺だけ(´・ω・`;)?