LoginSignup
36

More than 5 years have passed since last update.

DataGridView でセルの入力チェック、自動補正、自動確定/却下など

Posted at

DataGridView とは、便利なスプレッドシートっぽいコントロールでいろんなことができて便利だが、小難しいことをやる時には、 小難しいことをやらないといけなくて、そろその脳がオーバーフローしつつある。

いちいち過去のソースを見るのも面倒になってきたので、ここに覚えがきを書いておく。

セルが不正な値の時に却下する

CellValidating をハンドルして、e.FormattedValue に入っている値をチェックするロジックを入れる。

不正な値の時は「CancelEdit()」メソッドを実行すると、変更前の値に戻る。 あと「e.Cancel = True」も必要(理由は後述)

セルの内容を自動補完する

「1」を入力した時に自動で「001」に補完したい時は、DataGridView の CellParsing をハンドルする。 「e.Value」に入力値が入っているので、それを補正した値で上書きして、 「e.ParsingApplied = True」する。

セルの編集中(鉛筆印表示)のまま、DataGridView以外のコントロールで操作された時、編集を確定or却下させる。

Enterキーを押下したり、DataGridView の別のセルに移動したら編集は確定されるのだが、 そうではなく、同じフォームの「メニュー」項目をクリックしたり、 クローズボタンを押した場合は確定されず、編集中状態のまま、イベントが開始されてしまう。

こういう場合、編集中状態を解除するには 2種類方法があって、 (DataGridView).EndEdit か、(フォームインスタンス).Validate のいずれかを呼ぶ。

前者を呼ぶと編集は強制確定されるのだが、CellValidating とか呼ばれないので、 おかしな値がそのまま入ってしまうこともある。よってお勧めしない。

後者の場合、フォーム中のコントロール全て(つまり DataGridView含む)に対して登録操作が試みられる上に、 ちゃんと DataGridView では CellValidating が呼ばれるので、不正な値もちゃんとはじいてもらえる。

で、ここで値をはじいた場合、新に行おうとした操作もキャンセルすべきだろう (編集前の不本意な値で操作を続行されると不都合な結果になる)。 ここで生きているのが、先程の「CellValidating での e.Cancel = True」で、これをやっておくと、 (フォームインスタンス).Validate() の戻り値が False になってくれる。 だから、このコードは定番は次のようなものになる。

If Not Me.Validate() Then
    Return
End If

編集を破棄して終了していいですか?

フォームの FormClosing をハンドルする。 MsgBox とかでダイアログを出して、クローズをキャンセルさせる場合は「e.Cancel = True」。

あと、この時も、編集しかけの DataGridView を確定・却下させるべきだが、 却下した後、そのまま Return すると、そのままクローズされてしまうので、 先程の定番コードは、ここだけ

If Not Me.Validate() Then
    e.Cancel = True
    Return
End If

になる。

以上、http://nyaos.org/d/index.cgi?p=%282013.06.01%29+0943#p1 より転記

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36