C# 入力チェッククラス(文字列・数値・日付)

C#サンプルコードプログラミング

テキストボックスに入力された値が正しいかチェックするサンプルです。

入力エラーならチェック項目のわきにエラーを示すアイコンが表示されます。

また、エラー項目の背景色をピンクで表示します。

以前投稿した入力チェック3記事をクラスにまとめ、+αを加えたものです。

文字列の入力チェック

数値の入力チェック

日付の入力チェック

+αな機能は

・エラー項目にフォーカスをあてる。

(連続する入力チェックでは初めのエラー項目にセットされます。)

・エラー項目の背景色をピンクにする。

・連続するチェックでエラーがあったか見れるようにしました。

文字列入力チェック(isString)

・必須チェック

 必須指定の場合、未入力なら警告を通知します。

・最大バイト数チェック

 指定の最大BYTE数を超えているなら警告を通知します。

・文字区分チェック

 混在指定(引数省略可)・・・何もチェックしません。

 全角のみ指定     ・・・半角文字が含まれているなら警告を通知します。

 半角のみ指定     ・・・全角文字が含まれているなら警告を通知します

public static bool isString(ErrorProvider ep,
string itemName,TextBox c,
bool required,
int maxByteLength,StrKind strKind = StrKind.mix)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string項目名警告時に表示する項目名
3TextBoxテキストボックスチェック対象のテキストボックス
4bool必須区分true:必須 false:必須でない
5int最大BYTE数最大のBYTE数
6StrKind文字区分InputCheck.mix:全角半角混在
InputCheck.full:全角のみ
InputCheck.half:半角のみ
※ 省略時は全角半角混在

数値チェック(isNumber)

・必須チェック

 必須指定の場合、未入力なら警告を通知します。

・数値チェック

 数値に変換できない場合、警告を通知します。

public static bool isNumber(ErrorProvider ep, string itemName, TextBox c, bool required,
int pointNum, double minValue, double maxValue)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string項目名警告時に表示する項目名
3TextBoxテキストボックスチェック対象のテキストボックス
4bool必須区分true:必須 false:必須でない
5int少数以下桁数許す小数点以下の桁数
6double最小値許す最小値
7double最大値許す最大値

数値大小関係チェック(isNumberFromTo)の引数

・数値大小関係チェック

 終了値が開始値より小さいなら警告を通知します。

public static bool isNumberFromTo(ErrorProvider ep, string itemName1, string itemName2,
TextBox c1, TextBox c2)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string開始値の項目名警告時に表示する項目名
3string終了値の項目名警告時に表示する項目名
4TextBox開始値チェック対象のテキストボックス
5TextBox終了値チェック対象のテキストボックス

※数値チェックでエラーがない状態で行ってください。

日付チェック(isDate)の引数

・必須チェック

 必須指定の場合、未入力なら警告を通知します。

・日付チェック

 日付に変換できない場合、警告を通知します。

public static bool isDate(ErrorProvider ep, string itemName, TextBox c, bool required)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string項目名警告時に表示する項目名
3TextBoxテキストボックスチェック対象のテキストボックス
4bool必須区分true:必須 false:必須でない

日付チェック(isDateFromTo)の引数

・日付期間チェック

 終了日が開始日より前なら警告を通知します。

public static bool isDateFromTo(ErrorProvider ep, string itemName1, string itemName2,
TextBox c1, TextBox c2)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string開始日の項目名警告時に表示する項目名
3string終了日の項目名警告時に表示する項目名
4TextBox開始日チェック対象のテキストボックス
5TextBox終了日チェック対象のテキストボックス

※日付チェックでエラーがない状態で行ってください。

エラークリア(errorClear)

エラークリア

 ErrorProvider、エラーフラグ(isError)をクリアします。

public static void errorClear(ErrorProvider ep)
引数引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider

プロパティ

引数プロパティ概要内容
1isErrorエラーフラグエラーが発生したか参照する。
エラークリアでリセットされます。
2onSetFocusエラー項目フォーカスセットエラー項目にフォーカスをセットするか設定します。
※最初にエラーになった項目にセットされます。
3onSetColorエラー項目カラーセットエラー項目の背景色をピンクにセットするか設定します。

プログラミング

言語:C#

使用例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 入力チェック
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // ErrorProviderのインスタンス生成
        ErrorProvider ep = new ErrorProvider();

        /// <summary>
        /// 画面起動時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // ErrorProviderのアイコンを点滅なしに設定する
            ep.BlinkStyle = ErrorBlinkStyle.NeverBlink;
        }

        /// <summary>
        /// チェックボタンクリック処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCheck_Click(object sender, EventArgs e)
        {
            // ErrorProviderとエラーフラグをクリアする
            InputCheck.errorClear(ep);

            // 必須チェックの確認
            InputCheck.isString(ep, "必須チェック", textBox1, true, 20);

            // 最大BYTE数の確認
            InputCheck.isString(ep, "BYTE数チェック", textBox2, false, 20);

            // 全角のみの確認
            InputCheck.isString(ep, "全角のみチェック", textBox3, false, 20, InputCheck.StrKind.full);

            // 半角のみの確認
            InputCheck.isString(ep, "半角のみチェック", textBox4, false, 20, InputCheck.StrKind.half);

            // コイン所有枚数の数値チェック
            InputCheck.isNumber(ep, "コイン所有枚数", txtNumber, true, 0, 0, 100);

            // コイン購入予定数(開始)の数値チェック
            InputCheck.isNumber(ep, "コイン購入予定数(開始)", txtNumberFrom, false, 2, 0, 100.99);

            // コイン購入予定数(終了)の数値チェック
            InputCheck.isNumber(ep, "コイン購入予定数(終了)", txtNumberTo, false, 2, 0, 100.99);

            // 誕生日の日付チェック
            InputCheck.isDate(ep, "誕生日", txtBirthday, true);

            // 有効期間(開始)の日付チェック
            InputCheck.isDate(ep, "有効期間(開始)", txtDateFom, false);

            // 有効期間(終了)の日付チェック
            InputCheck.isDate(ep, "有効期間(終了)", txtDateTo, false);

            // ここまでエラーがなければ大小関係チェックを行う
            if (!InputCheck.isError)
            {
                // コイン購入予定数の大小関係チェック
                InputCheck.isNumberFromTo(ep, "コイン購入予定数(開始)", "コイン購入予定数(終了)",
                       txtNumberFrom, txtNumberTo);

                // 有効期間の大小関係チェック
                InputCheck.isDateFromTo(ep, "有効期間(開始)", "有効期間(終了)", txtDateFom, txtDateTo);
            }
        }
    }
}

入力チェッククラス

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Drawing;

/// <summary>
/// 入力チェッククラス
/// </summary>
static class InputCheck
{
    // エラーフラグ
    static public bool isError { get; set; } = false;

    // エラー項目フォーカスセットON/OFF
    static public bool onSetFocus { get; set; } = true;

    // エラー項目カラーセットON/OFF
    static public bool onSetColor { get; set; } = true;

    // エラー項目にセットする背景色(ピンク)
    static private Color ErrorbackColor = Color.MistyRose;

    // 文字区分
    public enum StrKind
    {
        mix,    // 全角半角混在
        full,   // 全角のみ
        half    // 半角のみ
    };

    /// <summary>
    /// 文字列の入力チェック
    /// </summary>
    /// <param name="ep">ErrorProvider</param>
    /// <param name="itemName">項目名</param>
    /// <param name="c">TextBox</param>
    /// <param name="required">必須区分(true:必須 false:必須でない)</param>
    /// <param name="maxByteLength">最大BYTE数</param>
    /// <param name="strKind">文字区分(mix:全角半角混在 full:全角のみ half:半角のみ)</param>
    /// <returns>結果</returns>
    public static bool isString(ErrorProvider ep,
                         string itemName,
                         TextBox c,
                         bool required,
                         int maxByteLength,
                         StrKind strKind = StrKind.mix)
    {
        backColorClear(c);
        string msg = "";

        // nullか空の文字列か判定する
        if (String.IsNullOrEmpty(c.Text))
        {
            // 必須チェックを行うか判定する
            if (required)
            {
                // 未入力の警告を通知する。
                msg = $"{itemName} は、必須項目です。";
                errorSet(ep, c, msg);

                // CHECK NG
                return false;
            }
            else
            {
                // CHECK OK
                return true;
            }
        }

        // バイト数を取得する
        Encoding encoding = Encoding.GetEncoding("shift_jis");
        int count = encoding.GetByteCount(c.Text);

        // 最大BYTE数を超えているか判定する
        if (count > maxByteLength)
        {
            // 最大BYTE数超えの警告を通知する
            msg = $"{itemName} は、最大文字数({maxByteLength} BYTE)を超えています。";
            errorSet(ep, c, msg);

            // CHECK NG
            return false;
        }

        // 文字区分を判定する
        if (strKind == StrKind.full)
        {
            // 全角のみか判定する
            if (count != c.Text.Length * 2)
            {
                // 全角のみでない警告を通知する
                msg = $"{itemName} に、全角以外の文字が含まれています。";
                errorSet(ep, c, msg);

                // CHECK NG
                return false;
            }
        }
        else if (strKind == StrKind.half)
        {
            // 半角のみか判定する
            if (count != c.Text.Length)
            {
                // 半角以外のみでない警告を通知する
                msg = $"{itemName} に、半角以外の文字が含まれています。";
                errorSet(ep, c, msg);

                // CHECK NG
                return false;
            }
        }

        // CHECK OK
        return true;
    }

    /// <summary>
    /// 数値チェック
    /// </summary>
    /// <param name="ep">ErrorProvider</param>
    /// <param name="itemName">項目名</param>
    /// <param name="c">TextBox</param>
    /// <param name="required">必須区分(true:必須 false:必須でない)</param>
    /// <param name="pointNum">少数以下桁数</param>
    /// <param name="minValue">最小値</param>
    /// <param name="maxValue">最大値</param>
    /// <returns>結果</returns>
    public static bool isNumber(ErrorProvider ep, string itemName, TextBox c, bool required,
                         int pointNum, double minValue, double maxValue)
    {
        backColorClear(c);
        string msg = "";

        // nullか空の文字列か判定する
        if (String.IsNullOrEmpty(c.Text))
        {
            // 必須チェックを行うか判定する
            if (required)
            {
                // 未入力の警告を通知する。
                msg = $"{itemName} は、必須項目です。";
                errorSet(ep, c, msg);

                // CHECK NG
                return false;
            }
            else
            {
                // CHECK OK
                return true;
            }
        }

        // 数値チェック
        double d;
        if (!double.TryParse(c.Text, out d))
        {
            // 数値でない警告を通知する
            msg = $"{itemName} は、数値ではありません。";
            errorSet(ep, c, msg);

            // CHECK NG
            return false;
        }

        // 範囲チェック
        if (d < minValue || d > maxValue)
        {
            // 範囲外の警告を通知する
            msg = $"{itemName} は、{minValue} ~ {maxValue} の範囲内で入力して下さい。";
            errorSet(ep, c, msg);

            // CHECK NG
            return false;
        }

        // ピリオドの位置を取得する
        int period = d.ToString().IndexOf(".");
        if (period == -1)
        {
            // CHECK OK (ピリオドなし)
            return true;
        }

        // 小数点以下の桁数チェック
        int digit = d.ToString().Substring(period + 1).Length;
        if (pointNum < digit)
        {
            if (pointNum == 0)
            {
                msg = $"{itemName} は、整数で入力して下さい。";
            }
            else
            {
                msg = $"{itemName} は、小数点以下の桁数を{pointNum}桁で入力して下さい。";
            }
            errorSet(ep, c, msg);

            // CHECK NG
            return false;
        }

        // CHECK OK
        return true;
    }

    /// <summary>
    /// 大小関係チェック
    /// </summary>
    /// <param name="ep">ErrorProvider</param>
    /// <param name="itemName1">開始値の項目名</param>
    /// <param name="itemName2">終了値の項目名</param>
    /// <param name="c1">開始値</param>
    /// <param name="c2">終了値</param>
    /// <returns>結果</returns>
    public static bool isNumberFromTo(ErrorProvider ep, string itemName1, string itemName2,
                                      TextBox c1, TextBox c2)
    {
        backColorClear(c2);
        string msg = "";

        // 開始値と終了値のどちらかが、null又は空文字か判定する
        if (String.IsNullOrEmpty(c1.Text) || String.IsNullOrEmpty(c2.Text))
        {
            // CHECK OK
            return true;
        }

        // 数値に変換する
        double d1 = double.Parse(c1.Text);
        double d2 = double.Parse(c2.Text);

        // 終了日が開始日より前か判定する
        if (d2 < d1)
        {
            // 終了値が開始値より前の警告を通知する
            msg = $"{itemName2} が、{itemName1} より小さい値です。";

            // 終了日の警告をセット
            errorSet(ep, c2, msg);

            // CHECK NG
            return false;
        }

        // CHECK OK
        return true;
    }

    /// <summary>
    /// 日付チェック
    /// </summary>
    /// <param name="ep">ErrorProvider</param>
    /// <param name="itemName">項目名</param>
    /// <param name="c">TextBox</param>
    /// <param name="required">必須区分(true:必須 false:必須でない)</param>
    /// <returns>結果</returns>
    public static bool isDate(ErrorProvider ep, string itemName, TextBox c, bool required)
    {
        backColorClear(c);
        string msg = "";

        // nullか空の文字列か判定する
        if (String.IsNullOrEmpty(c.Text))
        {
            // 必須チェックを行うか判定する
            if (required)
            {
                // 未入力の警告を通知する。
                msg = $"{itemName} は、必須項目です。";
                errorSet(ep, c, msg);

                // CHECK NG
                return false;
            }
            else
            {
                // CHECK OK
                return true;
            }
        }

        // 日付か判定する
        DateTime d;
        if (!DateTime.TryParse(c.Text, out d))
        {
            // 日付でない警告を通知する
            msg = $"{itemName} は、日付ではありません。";
            errorSet(ep, c, msg);

            // CHECK NG
            return false;
        }

        // CHECK OK
        return true;
    }

    /// <summary>
    /// 日付期間チェック
    /// </summary>
    /// <param name="ep">ErrorProvider</param>
    /// <param name="itemName1">開始日の項目名</param>
    /// <param name="itemName2">終了日の項目名</param>
    /// <param name="c1">開始日</param>
    /// <param name="c2">終了日</param>
    /// <returns>結果</returns>
    public static bool isDateFromTo(ErrorProvider ep, string itemName1, string itemName2,
                      TextBox c1, TextBox c2)
    {
        backColorClear(c2);
        string msg = "";

        // 開始と終了のどちらかが、null又は空文字か判定する
        if (String.IsNullOrEmpty(c1.Text) || String.IsNullOrEmpty(c2.Text))
        {
            // CHECK OK
            return true;
        }

        // 日付か判定する
        DateTime d1 = DateTime.Parse(c1.Text);
        DateTime d2 = DateTime.Parse(c2.Text);

        // 終了日が開始日より前か判定する
        if (d2 < d1)
        {
            // 終了日が開始日より前の警告を通知する
            msg = $"{itemName2} が、{itemName1} より前の日付です。";

            // 終了日の警告をセット
            errorSet(ep, c2, msg);

            // CHECK NG
            return false;
        }

        // CHECK OK
        return true;
    }

    /// <summary>
    /// エラークリア処理
    /// </summary>
    public static void errorClear(ErrorProvider ep)
    {
        // エラーフラグをクリアする
        isError = false;

        // ErrorProviderをクリアする
        ep.Clear();
    }

    /// <summary>
    /// エラーメッセージ設定処理
    /// </summary>
    /// <param name="ep"></param>
    /// <param name="msg"></param>
    private static void errorSet(ErrorProvider ep, Control c, string msg)
    {

        // エラーメッセージを通知する
        ep.SetError(c, msg);

        // 最初のエラーにフォーカスをセットする
        if (onSetFocus && isError == false)
        {
            //c.Focus();
        }

        // エラー項目の背景色をピンクにセットする
        if (onSetColor)
        {
            c.BackColor = ErrorbackColor;
        }

        // エラーフラグを立てる
        isError = true;
    }

    /// <summary>
    /// エラークリア処理
    /// </summary>
    public static void backColorClear(Control c)
    {
        if (onSetColor)
        {
            c.BackColor = Color.Empty;
        }
    }
}

実行結果

起動直後

文字列チェックの入力エラー

数値チェックの範囲チェックエラー

数値チェックの数値外エラー

数値チェックの大小比較エラー

日付チェックの日付外エラー

日付チェックの大小比較エラー

エラーがない状態です。

以上です。

コメント

タイトルとURLをコピーしました