テキストボックスに入力された日付が正しいかチェックするサンプルです。
サンプルとして、isDateメソッド、isDateFromToメソッドを作成しました。
isDateメソッドは日付チェックを行いエラーがあればErrorProviderに警告を通知します。
isDateFromToメソッドは開始日と終了日の大小関係をチェックします。
こちらもエラーがあればErrorProviderに警告を通知します。
入力チェックの内容
日付チェック
・必須チェック
必須指定の場合、未入力なら警告を通知します。
・日付チェック
日付に変換できない場合、警告を通知します。
日付チェック(isDate)の引数
No | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
2 | string | 項目名 | 警告時に表示する項目名 |
3 | TextBox | テキストボックス | チェック対象のテキストボックス |
4 | bool | 必須区分 | true:必須 false:必須でない |
日付期間チェック
・日付期間チェック
終了日が開始日より前なら警告を通知します。
日付チェック(isDateFromTo)の引数
No | 型 | 引数 | 内容 |
1 | ErrorProvider | ErrorProvider | 警告時に通知するErrorProvider |
1 | string | 開始日の項目名 | 警告時に表示する項目名 |
3 | string | 終了日の項目名 | 警告時に表示する項目名 |
4 | TextBox | 開始日 | チェック対象のテキストボックス |
5 | TextBox | 終了日 | チェック対象のテキストボックス |
サンプルの内容
①~③のチェックを行い、エラーがあれば警告の通知をメソッド内で行います。
正常であればtrue、エラーならfalseを返します。
① 必須チェックをする
IsNullOrEmptyを使用してnullか空の文字列かを判定しています。
② 日チェック
TryParseを使用して日付に変換できるか判定しています。
③ 日付期間チェック
開始日と終了日をDateTimeに変換し大小判定しています。
開始日と終了日の何れかが、nullか空文字の場合はチェックを行わずtrueを返します。
また、開始日と終了日の日付にエラーがないことを判定し呼び出しています。
使用部品

No | 項目名 | Text | name | 部品 |
1 | 誕生日(見出し) | 誕生日 | label1 | Label |
2 | 誕生日(入力欄) | 空 | txtBirthday | TextBox |
3 | 有効期間(見出し) | 有効期間 | label2 | Label |
4 | 有効期間・開始(入力欄) | 空 | txtDateFom | TextBox |
6 | 有効期間・終了(入力欄) | 空 | txtDateTo | TextBox |
9 | チェックボタン | チェック | button1 | Button |
プログラミング
言語: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 WindowsFormsApp19
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// ErrorProviderのインスタンス生成
ErrorProvider ep = new ErrorProvider();
// 画面起動時処理
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 button1_Click(object sender, EventArgs e)
{
// エラーフラグ
bool errFlg = false;
// ErrorProviderをクリアします。
ep.Clear();
// 誕生日の日付チェック
if ( !isDate(ep, "誕生日", txtBirthday, true))
{
errFlg = true;
}
// 有効期間(開始)の日付チェック
if (!isDate(ep, "有効期間(開始)", txtDateFom, false))
{
errFlg = true;
}
// 有効期間(終了)の日付チェック
if (!isDate(ep, "有効期間(終了)", txtDateTo, false))
{
errFlg = true;
}
if ( errFlg == false )
{
isDateFromTo(ep, "有効期間(開始)", "有効期間(終了)", txtDateFom, txtDateTo);
}
}
/// <summary>
/// 日付チェック
/// </summary>
/// <param name="ep">ErrorProvider</param>
/// <param name="itemName">項目名</param>
/// <param name="c">TextBox</param>
/// <param name="required">必須区分(true:必須 false:必須でない)</param>
/// <returns>結果</returns>
static bool isDate(ErrorProvider ep, string itemName,TextBox c,bool required)
{
string msg = "";
// nullか空の文字列か判定する
if (String.IsNullOrEmpty(c.Text))
{
// 必須チェックを行うか判定する
if (required)
{
// 未入力の警告を通知する。
msg = $"{itemName} は、必須項目です。";
ep.SetError(c, msg);
// CHECK NG
return false;
}
else
{
// CHECK OK
return true;
}
}
// 日付か判定する
DateTime d;
if (!DateTime.TryParse(c.Text, out d))
{
// 日付でない警告を通知する
msg = $"{itemName} は、日付ではありません。";
ep.SetError(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>
static bool isDateFromTo(ErrorProvider ep, string itemName1, string itemName2, TextBox c1, TextBox 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} より前の日付です。";
// 終了日の警告をセット
ep.SetError(c2, msg);
// CHECK NG
return false;
}
// CHECK OK
return true;
}
}
}
実行結果
誕生日:必須チェックの警告が通知されます。

有効期間(開始):日付でない警告が通知されます。

有効期間(終了):日付でない警告が通知されます。

終了日が開始日より前の警告が通知されます。

エラーがない場合には通知されません。

開始と終了のどちらかが未入力の場合には期間チェックは行いませんので、警告は通知されません。

以上です。