ペーストを受け付けないテキストボックス
キー入力以外でテキストボックスに値を入力する方法にペーストがあります。ペーストを無効にするためにWndProcメソッドをオーバーライドし、WindowsメッセージのメッセージIDを判定します。メッセージIDにより、イベントをキャンセルしてペーストを実行させないようにします。
最初にペーストのメッセージIDを定数宣言します。ペーストのメッセージIDは16進数で「302」なので、次のようになります。
private const int WM_PASTE = 0x302;
キー入力チェック時と同様にWndProcのオーバーライドを追加します。
protected override void WndProc(ref Message m) { base.WndProc (ref m); }
ペーストされた場合は、以降の処理を実施しないので、次のプログラムを追加します。
if ( m.Msg == WM_PASTE ) { return; }
以下が実装した結果です。
/// <summary> /// WndProcのオーバーライド /// Windows メッセージを処理します /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { if ( m.Msg == WM_PASTE ) { return; } base.WndProc (ref m); }
入力された文字種別をチェックする
テキストボックスに入力された文字が「ひらがなのみ」かどうか、「全角カタカナのみ」かどうかなど、入力チェックを行いたい種類はたくさんあると思います。ここでは以下の8パターンについての入力チェックを行います。
- 全角のみ
- 数値のみ
- 全角カタカナのみ
- 半角カタカナのみ
- ひらがなのみ
- 郵便番号のみ
- 実数のみ(Decimal)
- 電話番号のみ
なお、入力チェックの種別を設定できるように、入力チェック種別の列挙型を作成しておくと便利です。
public enum InputCheckedKind : uint { /// <summary>入力チェックなし</summary> None = 0x0000, /// <summary>全角のみ許可する</summary> FullSize = 0x0001, /// <summary>数値のみ許可する</summary> Numeric = 0x0002, /// <summary>全角カタカナのみ許可する</summary> FullSizeKatakana = 0x0003, /// <summary>半角カタカナのみ許可する</summary> HalfSizeKatakana = 0x0004, /// <summary>ひらがなのみ許可する</summary> Hiragana = 0x0005, /// <summary>郵便番号のみ許可する</summary> ZipCode = 0x0006, /// <summary>実数のみ許可する</summary> Decimal = 0x0007, /// <summary>電話番号のみ許可する</summary> Tel = 0x0008, }
整合性のチェックについて
入力値のチェックについては、正規表現を用いてパターンにマッチしているかどうかで判定を行います。正規表現を用いるには、System.Text.RegularExpressions.Regexクラスを用います。
「全角文字列のみ」のチェック
全角文字列のみの入力を許可する場合、入力された文字列がすべて2バイト文字かどうかをチェックします。これは、以下のようにして入力文字数と入力バイト数を取得し、「入力文字数×2が入力バイト数と等しいか」をチェックすることで判断します。
// 入力文字数を取得します int textLength = this.Text.Replace("\r\n", "").Length; // 入力バイト数を取得します int textByte = Encoding.GetEncoding("Shift_JIS").GetByteCount( this.Text.Replace("\r\n", ""));
チェック一覧
それ以外のチェックは、正規表現にマッチしているかどうかだけで判断することができます。以下に一般的なチェック内容と使用する正規表現をまとめました。
| チェック内容 | 正規表現 |
| 数値のチェック | ^[0-9]+$ |
| 全角カタカナのチェック | ^[ァ-ヴ!ー]+$ |
| 半角カタカナのチェック | ^[ア-゙]+$ |
| 全角ひらがなのチェック | ^[ぁ-ん!ー]+$ |
| 郵便番号のチェック | ^[0-9]{3}[-][0-9]{4}$ |
| 電話番号のチェック | ^[0-9]{2,5}-[0-9]{1,4}-[0-9]{4}$ |
実際に入力チェックを行うメソッドは、次のようにして実装します。
public bool InputCheck(out string errorMessage) { // エラーメッセージ errorMessage = string.Empty; bool result = false; Regex regex = new Regex("^[0-9]+$"); if ( !regex.IsMatch( this.Text )) { errorMessage = "数値のみ入力してください"; } else { result = true; } return result; }
プロパティの追加
小数点以下の桁数を設定するプロパティ
実数の場合、小数点以下の桁数を制限する必要が出てくると思います。そこで、最大値・最小値を設定したときと同様、小数点以下の桁数を設定するプロパティを追加します。
public int DecimalPlace { get { return this.decimalPlace; } set { this.decimalPlace = value; } }
