入力値のチェックにはColumnChangingイベントを使おう

私のバイブルでも書いてあることだが、業務システムで更新処理を実装する場合、テーブル更新の前に更新処理の妥当性チェックが必要である。
チェック項目は以下を想定

  • 入力文字種のチェック(半角英数字のみなど)
  • 文字列長のチェック
  • 数値・日付の範囲チェック

ASP.NETならまた話しは違うのだろうが、ここではWindows Formの場合を扱う。

Windows Formでこれらの処理を実装しようとすると、通常はテキストボックスなどのコントロールのValidatingイベントでチェックを行い、ErrorProviderを使ってエラー通知を行うのが一般的な実装方法らしい。(参考サイトはこちら)

しかしながら、業務システムのマスタ管理画面などでは、大量のテキストボックスなどが配置される。
こんな時はコントロール一つずつValidatingイベントのチェックをコーディングするのは効率が悪い。
そこで、以下の条件を満たせるのであれば、この非効率なコーディング作業を回避する良い方法がある。

  • DBなどから取得したデータは型指定されたDataSetで管理する。
  • DataProviderをフォームに設置する。
  • 各コントロールのDataBindingは、DataProviderを指定する。
  • ErrorProviderをフォームに配置し、DataSourceプロパティにDataProviderを指定する。

以上の条件を満たせばOK。(これらの設定はGUIで設定できる)
ここまで来れば、あとはDataTable.ColumnChangingイベントを使用して処理を一元化できる(^^)
イベントの設定はGUIからは設定できないので以下の要領でコードを追加する

dataset1.table1.ColumnChanging +=
    new DataColumnChangeEventHandler(this.Table1_ColumnChanging);

判定処理は以下の要領で行う。

仮に正規表現に一致しない場合をエラーにする場合は

private void Table1_ColumnChanging(object sender,
                                    System.Data.DataColumnChangeEventArgs e) {
    if (e.Column.ColumnName != "チェックすべき列の名前")
      return;
    string errorMessage = string.Empty;
    if (!Regex.IsMatch(e.ProposedValue.ToString(), "^[A-Z]{0,6}$"))
      errorMessage = "Error!";
    e.Row.SetColumnError(e.Column, errorMessage);
}

こうしておけば、データが書き変えられる時に、チェックが実行され、エラーメッセージがあれば、ErrorProviderがBindingの情報から該当するコントロールを割り出して、コントロールの横にエラーを示すアイコンとツールチップでエラーメッセージが表示される。

このように、コントロールのValidatingイベントを使用しなくても、更新時チェックが可能となる。

ただ、この書き方だとTable1_ColumnChangingが煩雑になるので、もうちょっとスッキリ書きたい。それはまた後日