2013.06.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2013.06.01) 0943

$ [.net] DataGridView セルの入力チェック、自動補正、自動確定/却下など [覚え書]

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

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

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

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

になる。

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー