C# GUIアプリで入力検証(バリデーション)を行う方法!WinForms・WPF初心者向け解説
生徒
C#でGUIアプリを作っているのですが、ユーザーが間違ったデータを入力しないように制限したいです。どうすればいいですか?
先生
それは入力検証、通称バリデーションという大事な工程ですね。ユーザーが意図しない操作をしても、アプリが正しく動くように防御する仕組みです。
生徒
難しそうですが、パソコンを触ったばかりの私でも設定できますか?
先生
大丈夫ですよ。まずは基本的な仕組みから一緒に見ていきましょう。
1. 入力検証(バリデーション)とは何か
プログラミングにおいて、入力検証とはユーザーから受け取ったデータが正しい形式や範囲内であるかを確認する処理のことです。英語ではバリデーションと呼びます。例えば、年齢を入力する欄にアルファベットや記号が入っていたら、計算ができませんよね。そういった間違いを未然に防ぐのがこの処理の目的です。
C#でデスクトップアプリを作る際、WinForms(ウィンドウフォーム)やWPF(ダブリューピーエフ)という技術を使いますが、どちらの場合もこの入力検証は非常に重要です。なぜなら、無効なデータはアプリの強制終了や予期せぬエラーの原因になるからです。例えるなら、書類の記入漏れがないか窓口でチェックするような作業ですね。
2. WinFormsでErrorProviderを使う基本
WinFormsには、簡単にエラーを表示できる「ErrorProvider」という便利な部品があります。これを使うと、入力欄の横に小さなアイコンを表示し、マウスを合わせるとエラーメッセージを出すことができます。初心者の方でも直感的に設定できるので、最初におすすめしたいテクニックです。
まずはツールボックスから「ErrorProvider」をフォームにドラッグ&ドロップしてください。そして、ボタンをクリックした時にチェックを走らせます。
private void btnSubmit_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtName.Text))
{
errorProvider1.SetError(txtName, "名前を入力してください。");
}
else
{
errorProvider1.SetError(txtName, "");
}
}
このコードでは、名前の入力欄が空かどうかを判定しています。「string.IsNullOrEmpty」という命令は、中身が空っぽかどうかを調べる道具です。空ならエラーを表示し、何かが入っていればエラーを消すという仕組みです。
3. 数値のみを入力させるテクニック
次に、数値専用の入力欄を作る方法を紹介します。例えば、電話番号や年齢の入力欄を作るとき、文字が入ってしまうと困りますよね。これを防ぐために、キーボードが押された瞬間にチェックする方法があります。
「KeyPress(キープレス)」イベントというものを使います。これはキーが押されるたびに実行される命令です。この中で、押されたキーが数字かどうかを判定し、数字以外なら入力をキャンセルします。
private void txtAge_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
{
e.Handled = true;
}
}
「char.IsDigit」は、押されたキーが0から9の数字かどうかをチェックする便利な命令です。このコードでは、数字以外が入力された場合に「e.Handled = true」とすることで、入力を無効化(なかったことに)しています。これでユーザーは数字以外入力できなくなります。
4. WPFでデータバインディングと検証ルールを活用する
次に、より現代的なWPFの技術を見ていきましょう。WPFでは「データバインディング」という、画面とプログラムのデータを自動的に連動させる仕組みがあります。これに「ValidationRule(バリデーションルール)」という検証用のルールを組み合わせるのが一般的です。
少し難しく聞こえるかもしれませんが、これは「ルールを決めておけば、画面が勝手に間違いをチェックしてくれる」という非常に効率的な仕組みです。大規模なアプリケーション開発では必須の知識となります。
public class AgeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int age;
if (int.TryParse(value.ToString(), out age) && age >= 0 && age <= 120)
{
return ValidationResult.ValidResult;
}
return new ValidationResult(false, "0から120の数字を入力してください。");
}
}
「int.TryParse」は、文字を数値に変換できるか試す命令です。変換できなければfalse、できれば数字として扱います。このようにクラスを作ることで、年齢という条件をいつでもどこでもチェックできるようになります。プログラムを整理整頓して書くための、大切な一歩です。
5. 正規表現を使った複雑な入力チェック
最後は、少し進んだテクニックとして「正規表現(せいきひょうげん)」を紹介します。これは、データの並び方をパターンで指定する手法です。例えば、メールアドレスの形式である「文字列@文字列.文字列」になっているかを確認したいとき、一つ一つ文字を調べるのは大変ですよね。
正規表現を使うと、たった一行のルールで高度なチェックが可能になります。C#では「System.Text.RegularExpressions」という機能を使います。
using System.Text.RegularExpressions;
bool isValid = Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$");
if (!isValid)
{
// エラー処理
}
「Regex.IsMatch」は、入力されたデータが指定したパターンに合致するかを判定します。この@やドットを含むパターンを書くことで、メールアドレスとして正しい形をしているか即座に確認できます。初心者の段階では少し難解に感じるかもしれませんが、覚えておくと非常に強力なツールとなります。
6. 良いユーザー体験を作るために
入力検証において最も大切なのは、ユーザーに対して「何が間違っているのか」を優しく伝えることです。エラーメッセージが冷たいと、ユーザーは「このアプリは難しい」と感じて使わなくなってしまいます。「名前を入力してください」や「数字以外は入力できません」といった、具体的で分かりやすいメッセージを心がけましょう。
また、ボタンを押したときだけでなく、入力中や入力が終わった瞬間にチェックを行うと、ユーザーは間違いに早く気づけます。GUIアプリケーションにおいては、スムーズな操作感も機能の一部です。使いやすさと安全性を両立させるアプリ作りを目指しましょう。
これからも、C#の学習を続けていくと、さらに便利な機能に出会えます。今回学んだエラープロバイダーやイベント処理は、どんなGUIアプリを作る時にも必ず役に立つ基礎知識です。焦らず一つずつ試しながら、自分だけのアプリケーションを作り上げてください。