UserControls/PatternNameHeaderControl.cs

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;
using ChatworkBulkSender.Utils;

namespace ChatworkBulkSender.UserControls
{
    public partial class PatternNameHeaderControl : UserControl
    {
        private ErrorProvider errorProvider;

        public PatternNameHeaderControl()
        {
            InitializeComponent();
            InitializeValidation();
        }

        private void InitializeValidation()
        {
            // ErrorProviderの初期化
            errorProvider = new ErrorProvider();
            errorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;

            // MaxLength設定
            txtPatternName.MaxLength = Constants.PATTERN_NAME_MAX_LENGTH;
            txtSortOrder.MaxLength = 3; // 最大999なので3桁

            // イベントハンドラーの登録
            txtPatternName.TextChanged += TxtPatternName_TextChanged;
            txtSortOrder.TextChanged += TxtSortOrder_TextChanged;
            txtSortOrder.KeyPress += TxtSortOrder_KeyPress;
        }

        private void TxtPatternName_TextChanged(object sender, EventArgs e)
        {
            ValidatePatternName();
        }

        private void TxtSortOrder_TextChanged(object sender, EventArgs e)
        {
            ValidateSortOrder();
        }

        private void TxtSortOrder_KeyPress(object sender, KeyPressEventArgs e)
        {
            // 数字とバックスペース以外の入力を制限
            if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b')
            {
                e.Handled = true;
            }
        }

        public bool ValidatePatternName()
        {
            if (string.IsNullOrWhiteSpace(txtPatternName.Text))
            {
                errorProvider.SetError(txtPatternName, "パターン名称を入力してください。");
                return false;
            }
            else if (txtPatternName.TextLength > Constants.PATTERN_NAME_MAX_LENGTH)
            {
                errorProvider.SetError(txtPatternName, 
                    ValidationHelperUtil.GetLengthErrorMessage("パターン名称", txtPatternName.TextLength, Constants.PATTERN_NAME_MAX_LENGTH));
                return false;
            }
            else
            {
                errorProvider.SetError(txtPatternName, "");
                return true;
            }
        }

        public bool ValidateSortOrder()
        {
            if (string.IsNullOrWhiteSpace(txtSortOrder.Text))
            {
                errorProvider.SetError(txtSortOrder, "並び順を入力してください。");
                return false;
            }

            if (!int.TryParse(txtSortOrder.Text, out int sortOrder))
            {
                errorProvider.SetError(txtSortOrder, "並び順は数値で入力してください。");
                return false;
            }

            if (sortOrder < Constants.PATTERN_SORT_ORDER_MIN || sortOrder > Constants.PATTERN_SORT_ORDER_MAX)
            {
                errorProvider.SetError(txtSortOrder, 
                    $"並び順は{Constants.PATTERN_SORT_ORDER_MIN}~{Constants.PATTERN_SORT_ORDER_MAX}の範囲で入力してください。");
                return false;
            }

            errorProvider.SetError(txtSortOrder, "");
            return true;
        }

        public bool ValidateAll()
        {
            bool isPatternNameValid = ValidatePatternName();
            bool isSortOrderValid = ValidateSortOrder();
            return isPatternNameValid && isSortOrderValid;
        }
    }
}