Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

C#の入力チェック実例サンプルコード

全角チェックや数値チェックなどの基本的な実装方法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/04/16 08:00

ダウンロード 実行ファイル (11.5 KB)
ダウンロード ソースコード (21.7 KB)

入力チェックの実装は、誰もが一度は経験することだと思います。ここではC#の標準コントロールを拡張し、基本的な入力チェックを実装する方法を紹介します。

目次

はじめに

 標準のコントロールを使用して、アプリケーションの作成を行った場合、数値入力のみを許可したり、ペーストを禁止したりしたいと思ったことはありませんか? それらを実装するには、入力規則のチェックなど使用しているコントロールの数だけ、プログラミングを行う必要があります。

 共通的なチェックを行う場合、標準のコントロールを少し拡張するだけで、プログラミングを行う量を減らすことができ、生産性を上げることができます。ここでは、標準コントロールを基本クラスとする派生クラスを作成し、派生クラスに少しの機能拡張を行って入力規制や入力チェックなどを行えるようにします。

対象読者

 .NETでWindowsアプリケーションを作ったことのある人、または作りたい人。

必要な環境

 C#または、VS.NETのプログラミングが行える環境が必要です。NET Framework 1.1のクラスやメンバを使用しているので、.NET Framework 1.1以上がインストールされていることが必須条件です。.NET Framework 1.0でも動くかもしれませんが動作検証は行っておりません。

入力チェック一覧

 本稿で説明する入力チェックは、以下の通りです。

  • キー入力を制限するテキストボックス
  • ペーストを許可しないテキストボックス
  • 入力文字種別をチェックするテキストボックス(全角カタカナのみ、数値のみなど)
  • 通貨型をチェックするテキストボックス
  • フォーカスが移動する際に行われる入力チェック
  • チェックをはずせるラジオボタン

キー入力のチェックを行うテキストボックス

 数値や小数点、マイナス記号のみの入力しか許可したくない場合、キーボードでの入力チェックを行う必要があります。この場合、テキストボックスのKeyPressイベントを処理するめに、TextBoxクラスのOnKeyPressメソッドをオーバーライドし、リアルタイムで入力規制を行います。

 まず、テキストボックスの拡張クラス(CustomTextBox)を作成し、オーバーライドメソッドを追加します。

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
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2007/04/16 17:15 少数→小数に修正。 コメントの表記を統一。

著者プロフィール

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5