はじめに
標準のコントロールを使用して、アプリケーションの作成を行った場合、数値入力のみを許可したり、ペーストを禁止したりしたいと思ったことはありませんか? それらを実装するには、入力規則のチェックなど使用しているコントロールの数だけ、プログラミングを行う必要があります。
共通的なチェックを行う場合、標準のコントロールを少し拡張するだけで、プログラミングを行う量を減らすことができ、生産性を上げることができます。ここでは、標準コントロールを基本クラスとする派生クラスを作成し、派生クラスに少しの機能拡張を行って入力規制や入力チェックなどを行えるようにします。
対象読者
.NETでWindowsアプリケーションを作ったことのある人、または作りたい人。
必要な環境
C#または、VS.NETのプログラミングが行える環境が必要です。NET Framework 1.1のクラスやメンバを使用しているので、.NET Framework 1.1以上がインストールされていることが必須条件です。.NET Framework 1.0でも動くかもしれませんが動作検証は行っておりません。
入力チェック一覧
本稿で説明する入力チェックは、以下の通りです。
- キー入力を制限するテキストボックス
- ペーストを許可しないテキストボックス
- 入力文字種別をチェックするテキストボックス(全角カタカナのみ、数値のみなど)
- 通貨型をチェックするテキストボックス
- フォーカスが移動する際に行われる入力チェック
- チェックをはずせるラジオボタン
キー入力のチェックを行うテキストボックス
数値や小数点、マイナス記号のみの入力しか許可したくない場合、キーボードでの入力チェックを行う必要があります。この場合、テキストボックスのKeyPressイベントを処理するめに、TextBox
クラスのOnKeyPress
メソッドをオーバーライドし、リアルタイムで入力規制を行います。
まず、テキストボックスの拡張クラス(CustomTextBox)を作成し、オーバーライドメソッドを追加します。
protected override void OnKeyPress( System.Windows.Forms.KeyPressEventArgs e) { base.OnKeyPress (e); }
追加したオーバーライドメソッドに数値以外を入力させないようにするため、以下のプログラムを追加します。また「Backspace」を許可するために、'\b'
を許可します。
// 数字以外入力させない if ( (e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' ) { e.Handled = true; }
小数点の入力を許可するときは、以下のようにします。
// 数字と小数点(1つ)以外入力させない if (e.KeyChar == '.') { if ( this.Text.IndexOf(".") >= 0 || this.Text.Length == 0 ) { e.Handled = true; } } else if ( (e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' ) { e.Handled = true; }
数値入力範囲について
ここで数字の入力チェックはしましたが、数値の範囲、マイナスを許可するかどうかといった「数値入力範囲」は、CustomTextBoxクラスのプロパティで管理します。CustomTextBoxのメンバ変数maxValue
で最大値を、minValue
で最小値を管理しています。
CustomTextBoxクラス内に最大値と最小値を持つプロパティを、それぞれ作成します。
public decimal MaxValue { get { return this.maxValue; } set { this.maxValue = value; } } public decimal MinValue { get { return this.minValue; } set { this.minValue = value; } }
次にCustomTextBoxクラスを呼び出す側で、以下のようにして最大値・最小値を設定します。
this.rangeTextBox.MaxValue = 100M; this.rangeTextBox.MinValue = -100M;
ここまでをまとめたソースは以下の通りとなります。ここではSampleFormを作り、その中でCustomTextBoxクラスを使う例を示しています。
CustomTextBox側
/// <summary>上限値</summary> private decimal maxValue = 0M; /// <summary>下限値</summary> private decimal minValue = 0M; /// <summary>限界値の設定を使う</summary> private bool usedLimit = false;
// 最大値のプロパティ public decimal MaxValue { get { return this.maxValue; } set { this.maxValue = value; } } // 最小値のプロパティ public decimal MinValue { get { return this.minValue; } set { this.minValue = value; } } // 限界値を使用するかのプロパティ public bool UsedLimit { get { return this.usedLimit; } set { this.usedLimit = value; } }
チェックメソッドのif文には、それぞれ適切な処理を記述するようにします。
public bool InputCheck(out string errorMessage) { : :中略 : if ( this.usedLimit && ( Convert.ToDecimal( this.Text ) > this.maxValue || Convert.ToDecimal( this.Text ) < this.minValue ) ) { // 入力範囲外 } else { // 入力範囲を使用しない、または範囲内 } : :中略 : }
SampleForm側
errorMessage
には、入力エラー時にエラーメッセージが格納されます。
// 限界値の設定を行う this.rangeTextBox.UsedLimit = true; // 入力範囲の最大値を100に設定する this.rangeTextBox.MaxValue = 100M; // 入力範囲の最小値を-100に設定する this.rangeTextBox.MinValue = -100M; // 入力チェックメソッドの呼び出し string errorMessage = string.Empty; if ( !this.rangeTextBox.InputCheck( out errorMessage ) ) { // チェックNG } else { // チェックOK }