質問: DataGridに入力された値をDBに登録するシステムを作っているのですが、DataErrorハンドラが必要のない場面でハンドルされてしまいます。 コードを貼らせていただきます。 ``` private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { if (e.Exception != null) { MessageBox.Show(this, string.Format("{0}", e.Exception.Message), "エラーが発生しました", MessageBoxButtons.OK, MessageBoxIcon.Error); dataGridView1.CancelEdit(); } } ``` 例外が発生していた場合にメッセージで知らせるというものです。 1行に5つのセルがあり、いずれもNULLが許されないものです。 新規行の1列目になにか値を入力し、登録処理を行えばDataErrorがハンドルされるのは希望通りの動きなのですが、やっぱりやめた、とFormを閉じようとすると、そのタイミングでもDataErrorがハンドルされてしまいます。 Formを閉じるときにはハンドルされないようにするのは、どのようにすればいいのでしょうか?
回答: `DataGridView`の`CausesValidation`をfalseにすれば、 フォームを閉じる際に`DataError`イベントが走らなくなると思います。 が、`CausesValidation`をfalseにした場合、`DataGridView`編集中に 他のボタン等のコントロールを押下しても`DataError`イベントが実行されません。 これを避けるには、 `DataGridView`にフォーカスがあたっているときは`CausesValidation`をfalseに、 フォーカスが外れたときは`CausesValidation`をtrueにすることで対応できます。 具体的なコードは以下です。 ``` private void dataGridView1_Enter(object sender, EventArgs e) { ((DataGridView)sender).CausesValidation = false; } private void dataGridView1_Leave(object sender, EventArgs e) { ((DataGridView)sender).CausesValidation = true; } ``` 他にもやり方あると思いますが、自分が思いつくのは以上です。