【学習】WinFormsでErrorProviderを使ってみよう(入力エラーをアイコンで表示する)

広告

これまでの学習では、

  • TextBox や NumericUpDown で入力を受け付ける
  • エラーがあれば Label に「〇〇を入力してください」と表示する

という形で入力チェックをしてきました。

しかし、項目が増えると、どの項目がエラーかが分かりにくくなります。

エラーがあるコントロールの横にアイコンを表示する

という仕組みです。

今回は ErrorProvider(エラープロバイダー) を使って、名前と年齢の入力フォームで、エラーがある項目の横に赤いアイコンを表示するアプリを作ります。

今日作るもの

名前年齢を入力して 登録 ボタンを押すと、

  • 名前が空 → 名前の TextBox の横に赤いアイコン(マウスオーバーで「名前を入力してください」と表示)
  • 年齢が 0〜120 の範囲外 → NumericUpDown の横に赤いアイコン
  • 両方 OK → エラーをクリアして「登録しました」と表示

という動作をします。


ソリューションとプロジェクトを作る

Visual Studio で新しいプロジェクトを作ります。

  • テンプレート: Windows Forms アプリ (.NET Framework)
  • ソリューション名: ErrorProviderSample
  • プロジェクト名: ErrorProviderDemo

作成すると Form1 が表示されます。


フォームに配置するコントロール

フォームに次のものを配置します。

コントロール名前
LabelnameLabel
TextBoxnameTextBox
LabelageLabel
NumericUpDownageBox
ButtonsubmitButton
LabelresultLabel
ErrorProvidererrorProvider1

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 は入力検証の表示を分かりやすくする基本コンポーネントです。

訪問数 3 回, 今日の訪問数 3回

広告