テキストボックスに入力された値が正しいかチェックするサンプルです。
入力エラーならチェック項目のわきにエラーを示すアイコンが表示されます。
また、エラー項目の背景色をピンクで表示します。
以前投稿した入力チェック3記事をクラスにまとめ、+αを加えたものです。
+αな機能は
・エラー項目にフォーカスをあてる。
(連続する入力チェックでは初めのエラー項目にセットされます。)
・エラー項目の背景色をピンクにする。
・連続するチェックでエラーがあったか見れるようにしました。
文字列入力チェック(isString)
・必須チェック
必須指定の場合、未入力なら警告を通知します。
・最大バイト数チェック
指定の最大BYTE数を超えているなら警告を通知します。
・文字区分チェック
混在指定(引数省略可)・・・何もチェックしません。
全角のみ指定 ・・・半角文字が含まれているなら警告を通知します。
半角のみ指定 ・・・全角文字が含まれているなら警告を通知します
public static bool isString(ErrorProvider ep,
string itemName,TextBox c,
bool required,
int maxByteLength,StrKind strKind = StrKind.mix)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 項目名 | 警告時に表示する項目名 |
3 | TextBox | テキストボックス | チェック対象のテキストボックス |
4 | bool | 必須区分 | true:必須 false:必須でない |
5 | int | 最大BYTE数 | 最大のBYTE数 |
6 | StrKind | 文字区分 | 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)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 項目名 | 警告時に表示する項目名 |
3 | TextBox | テキストボックス | チェック対象のテキストボックス |
4 | bool | 必須区分 | true:必須 false:必須でない |
5 | int | 少数以下桁数 | 許す小数点以下の桁数 |
6 | double | 最小値 | 許す最小値 |
7 | double | 最大値 | 許す最大値 |
数値大小関係チェック(isNumberFromTo)の引数
・数値大小関係チェック
終了値が開始値より小さいなら警告を通知します。
public static bool isNumberFromTo(ErrorProvider ep, string itemName1, string itemName2,
TextBox c1, TextBox c2)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 開始値の項目名 | 警告時に表示する項目名 |
3 | string | 終了値の項目名 | 警告時に表示する項目名 |
4 | TextBox | 開始値 | チェック対象のテキストボックス |
5 | TextBox | 終了値 | チェック対象のテキストボックス |
※数値チェックでエラーがない状態で行ってください。
日付チェック(isDate)の引数
・必須チェック
必須指定の場合、未入力なら警告を通知します。
・日付チェック
日付に変換できない場合、警告を通知します。
public static bool isDate(ErrorProvider ep, string itemName, TextBox c, bool required)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 項目名 | 警告時に表示する項目名 |
3 | TextBox | テキストボックス | チェック対象のテキストボックス |
4 | bool | 必須区分 | true:必須 false:必須でない |
日付チェック(isDateFromTo)の引数
・日付期間チェック
終了日が開始日より前なら警告を通知します。
public static bool isDateFromTo(ErrorProvider ep, string itemName1, string itemName2,
TextBox c1, TextBox c2)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 開始日の項目名 | 警告時に表示する項目名 |
3 | string | 終了日の項目名 | 警告時に表示する項目名 |
4 | TextBox | 開始日 | チェック対象のテキストボックス |
5 | TextBox | 終了日 | チェック対象のテキストボックス |
※日付チェックでエラーがない状態で行ってください。
エラークリア(errorClear)
・エラークリア
ErrorProvider、エラーフラグ(isError)をクリアします。
public static void errorClear(ErrorProvider ep)
引数 | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
プロパティ
引数 | プロパティ | 概要 | 内容 |
1 | isError | エラーフラグ | エラーが発生したか参照する。 ※エラークリアでリセットされます。 |
2 | onSetFocus | エラー項目フォーカスセット | エラー項目にフォーカスをセットするか設定します。 ※最初にエラーになった項目にセットされます。 |
3 | onSetColor | エラー項目カラーセット | エラー項目の背景色をピンクにセットするか設定します。 |
プログラミング
言語: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;
}
}
}
実行結果
起動直後
文字列チェックの入力エラー
数値チェックの範囲チェックエラー
数値チェックの数値外エラー
数値チェックの大小比較エラー
日付チェックの日付外エラー
日付チェックの大小比較エラー
エラーがない状態です。
以上です。