【学習】WinFormsでErrorProviderを使ってみよう(入力エラーをアイコンで表示する)
これまでの学習では、
- TextBox や NumericUpDown で入力を受け付ける
- エラーがあれば Label に「〇〇を入力してください」と表示する
という形で入力チェックをしてきました。
しかし、項目が増えると、どの項目がエラーかが分かりにくくなります。
エラーがあるコントロールの横にアイコンを表示する
という仕組みです。
今回は ErrorProvider(エラープロバイダー) を使って、名前と年齢の入力フォームで、エラーがある項目の横に赤いアイコンを表示するアプリを作ります。
今日作るもの
名前と年齢を入力して 登録 ボタンを押すと、
- 名前が空 → 名前の TextBox の横に赤いアイコン(マウスオーバーで「名前を入力してください」と表示)
- 年齢が 0〜120 の範囲外 → NumericUpDown の横に赤いアイコン
- 両方 OK → エラーをクリアして「登録しました」と表示
という動作をします。
ソリューションとプロジェクトを作る
Visual Studio で新しいプロジェクトを作ります。
- テンプレート: Windows Forms アプリ (.NET Framework)
- ソリューション名: ErrorProviderSample
- プロジェクト名: ErrorProviderDemo
作成すると Form1 が表示されます。
フォームに配置するコントロール
フォームに次のものを配置します。
| コントロール | 名前 |
|---|---|
| Label | nameLabel |
| TextBox | nameTextBox |
| Label | ageLabel |
| NumericUpDown | ageBox |
| Button | submitButton |
| Label | resultLabel |
| ErrorProvider | errorProvider1 |
ErrorProvider の配置方法
ErrorProvider はコントロールではなくコンポーネントです。ツールボックスの「コンポーネント」カテゴリから ErrorProvider をドラッグしてフォームに置くと、フォームの下部(コンポーネントトレイ)に表示されます。画面上には何も表示されませんが、これで使えるようになります。
nameLabel の Text を「名前:」、ageLabel の Text を「年齢:」、submitButton の Text を「登録」、resultLabel の Text を空にしておきます。
ageBox の Minimum を 0、Maximum を 150、Value を 0 に設定します(0〜120 の範囲チェックはコードで行います)。
ErrorProvider の仕組み
- ErrorProvider … コントロールの横に赤いアイコンを表示するコンポーネント
- SetError(コントロール, “メッセージ") … エラーを表示する(空文字 “" でクリア)
- アイコンにマウスを乗せると、メッセージがツールチップで表示される
- 検証が通った項目は、必ず SetError(コントロール, “") でクリアする
イベントを登録する
submitButton をダブルクリックすると submitButton_Click イベントが作成されます。
ここで名前と年齢をチェックし、エラーがあれば SetError で表示、なければクリアして処理を続行します。
完成コード
using System;
using System.Windows.Forms;
namespace ErrorProviderDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void submitButton_Click(object sender, EventArgs e)
{
bool hasError = false;
// 名前チェック
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
{
errorProvider1.SetError(nameTextBox, "名前を入力してください");
hasError = true;
}
else
{
errorProvider1.SetError(nameTextBox, "");
}
// 年齢チェック(0〜120の範囲)
if (ageBox.Value < 0 || ageBox.Value > 120)
{
errorProvider1.SetError(ageBox, "0〜120の範囲で入力してください");
hasError = true;
}
else
{
errorProvider1.SetError(ageBox, "");
}
if (hasError)
{
resultLabel.Text = "";
return;
}
resultLabel.Text = "登録しました";
}
}
}
プログラムの流れ
登録ボタンを押す
↓
名前が空かチェック
↓
空なら SetError(nameTextBox, "名前を入力してください")
空でなければ SetError(nameTextBox, "")
↓
年齢が 0〜120 の範囲かチェック
↓
範囲外なら SetError(ageBox, "0〜120の範囲で入力してください")
範囲内なら SetError(ageBox, "")
↓
エラーがあれば return
↓
resultLabel に「登録しました」と表示
SetError の使い方
| 用途 | コード |
|---|---|
| エラーを表示 | errorProvider1.SetError(コントロール, "メッセージ"); |
| エラーをクリア | errorProvider1.SetError(コントロール, ""); |
重要:検証が通った項目は、必ず SetError(コントロール, "") でクリアしてください。前回のエラーが残ったままになるのを防げます。
重要ポイント
ErrorProvider は「どの項目がエラーか」を視覚的に示すコンポーネントです。
- ErrorProvider はコンポーネント(ツールボックスの「コンポーネント」から配置)
- SetError(コントロール, “メッセージ") でエラー表示、SetError(コントロール, “") でクリア
- 検証が通った項目は必ずクリアする
- Label にエラーを書くより、項目ごとに「ここがエラー」と分かりやすい
- 電話帳、家計簿、登録フォームなど、実務アプリの入力検証でよく使う
発展:Validating イベントでフォーカス移動時に検証
ボタンクリックだけでなく、フォーカスが次のコントロールに移るときに検証したい場合は、Validating イベントを使います。
private void nameTextBox_Validating(object sender, CancelEventArgs e)
{
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
{
errorProvider1.SetError(nameTextBox, "名前を入力してください");
}
else
{
errorProvider1.SetError(nameTextBox, "");
}
}
発展:BlinkStyle でアイコンの点滅を制御
ErrorProvider の BlinkStyle プロパティで、アイコンの点滅を制御できます。
| 値 | 説明 |
|---|---|
| BlinkIfDifferentError | エラーメッセージが変わったときだけ点滅(既定) |
| AlwaysBlink | 常に点滅 |
| NeverBlink | 点滅しない |
発展アイデア
ErrorProvider を使うと次のようなものも作れます。
- 電話帳の登録フォーム … 名前・電話番号・メールアドレスの検証
- 家計簿の入力 … 金額・日付の範囲チェック
- ログイン画面 … ユーザー名・パスワードの必須チェック
- int.TryParse との組み合わせ … TextBox で数値入力したときの形式チェック
ErrorProvider は入力検証の表示を分かりやすくする基本コンポーネントです。



ディスカッション
コメント一覧
まだ、コメントがありません