入力値のチェックには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が煩雑になるので、もうちょっとスッキリ書きたい。それはまた後日