C# Windowsフォームで入力制限、チェックを正規表現で行う


# 1. はじめに
* C# Windowsフォームで正規表現で入力チェックをしたい
* エラーが発生した場所、発生内容をポップアップで分かるようにしたい


# 2. 開発環境
* Visual Studio 2022
* .NET6
* Windows10

# 3. 動作イメージ
* 数字以外を入力するとテキストボックスに反映されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e285e5f8-1e6b-c55d-4781-e7f893f25bf3.png)

* `Check`ボタンをクリックすると、エラーの発生場所、内容がわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/efa0d3f6-7d72-7314-afcc-c1f6ab1ecc3b.png)

* 数値を入力しなおすとエラーがクリアされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/7dd59e47-3a36-5601-f025-ab87a4e820f2.png)

# 4. プログラムを作成する

# 4.1. Windowsフォーム
* 以下のコンポーネントを配置する

| コンポーネント | NAME | 内容 |
|:-----------|:------------|:------------|
| Label       | Label1        | ラベル         |
| TextBox       | AgeTextBox        | テキストボックス         |
| Button       | CheckButton        | ボタン         |


# 4.2. コードビハインド
```csharp:Form1.cs
using System.Text.RegularExpressions;

namespace ErrorProviderSample
{
    public partial class Form1 : Form
    {

        // ErrorProviderのインスタンスを生成
        ErrorProvider errorProvider = new ErrorProvider();

        // 正規表現を生成
        Regex notIntRegex = new Regex(@"[^0-9]"); //数字以外にマッチする

        public Form1()
        {
            InitializeComponent();
            // アイコンを点滅なしに設定する
            errorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;
        }


        /// <summary>
        /// Ageテキストボックスを変更した時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AgeTextBox_TextChanged(object sender, EventArgs e)
        {
            int i = AgeTextBox.SelectionStart;
            AgeTextBox.Text = notIntRegex.Replace(AgeTextBox.Text, "");
            AgeTextBox.SelectionStart = i;
        }

        /// <summary>
        /// Ageテキストボックスの検証コードを呼び出す
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AgeTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (!string.IsNullOrEmpty(AgeTextBox.Text)) {
                // 正常に整数に変換できた場合はエラーをクリアする
                errorProvider.SetError(AgeTextBox, "");
                AgeTextBox.BackColor = Color.White;
            }
        }
        
        /// <summary>
        /// Checkボタンをクリックした時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CheckButton_Click(object sender, EventArgs e)
        {
            // 必須入力チェック
            if (string.IsNullOrEmpty(AgeTextBox.Text))
            {
                // 例外が発生したのでエラーを表示する
                errorProvider.SetError(AgeTextBox, "Ageは入力必須です");
                AgeTextBox.BackColor = Color.LightPink;

                return;
            }

            MessageBox.Show("入力チェックOK");
        }
    }
}
```
* ErrorProviderクラス（エラー表示）、Regexクラス（正規表現）を生成する
* 起動時にErrorProviderクラスをアイコンを点滅なしに変更する（デフォルトは点滅）
* TextChangedメソッドで数値以外の値が入力された場合、テキストボックスへ反映しないようにする
* Validatingメソッドで必須入力がOKの場合、エラーをクリアする（前のメソッドがあるため、数値以外の値は入らないはず）
* Checkボタンをクリックした時に必須入力チェックを行う

# 5. ソースコード
https://github.com/YoshijiGates/CSharp/tree/main/ErrorProviderSample

# 6. 参考文献
http://tsumiyan.blog.fc2.com/blog-entry-9.html