【入門編】DataGridViewのCellFormattingとCellParsingイベントの完全制御:日付や金額のカスタムフォーマット入力とバリデーションを両立させる実務手法 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは。現場で叩き上げ、数多のレガシーシステムを現代的なアーキテクチャへと昇華させてきたエンジニアです。

今日は、Windows Forms開発において多くのエンジニアが「魔法のように見えて実は泥沼」に陥るDataGridViewのセル制御について、その心臓部を紐解いていきます。

「入力時はシンプルに、表示時はリッチに」。このUX(ユーザー体験)を実現するための鍵は、`CellFormatting`と`CellParsing`という二つのイベントを正しく「対」として操ることです。

—

1. なぜ「表示」と「入力」を分ける必要があるのか?

初心者がやりがちなミスは、「セルに入力された値をそのまま文字列として整形して保持する」ことです。これでは、計算が必要になった瞬間にカンマや円マークが邪魔をしてエラーになります。

  • CellFormatting (表示の魔法): ユーザーがセルからフォーカスを外した時(または描画時)、生のデータ(数値や日付)を、読みやすい形式(カンマ区切り、和暦など)に変換します。
  • CellParsing (入力の解釈): ユーザーが入力した形式(例:「1000」や「R5.5.5」)を、プログラムが理解できる生のデータ(1000やDate型)に逆変換します。

この二つをセットで組むことで、「データは純粋に、見た目は華やかに」という理想のUIが完成します。

—

2. 実践コード:金額のカンマ区切りと日付の和暦表示

以下のコードは、ある特定の列(ここではインデックスを指定)に対して、この魔法をかける実例です。

‘ DataGridViewのCellFormattingイベント
‘ 表示時に数値をカンマ区切りにする
Private Sub dgvMain_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvMain.CellFormatting
‘ 対象列のみ処理する(インデックス0を金額列、1を日付列と仮定)
If e.ColumnIndex = 0 AndAlso e.Value IsNot Nothing Then
‘ 数値をカンマ区切りの文字列に変換
e.Value = String.Format(“{0:#,

0}”, e.Value)

e.FormattingApplied = True ‘ 処理済みのフラグを立てる(重要!)
ElseIf e.ColumnIndex = 1 AndAlso IsDate(e.Value) Then
‘ 日付を和暦(例: R05.05.05)に変換
Dim ci As New System.Globalization.CultureInfo(“ja-JP”, True)
ci.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
e.Value = CType(e.Value, Date).ToString(“ggyy.MM.dd”, ci)
e.FormattingApplied = True
End If
End Sub

‘ DataGridViewのCellParsingイベント
‘ 編集終了時に文字列を本来の型(数値・日付)に戻す
Private Sub dgvMain_CellParsing(sender As Object, e As DataGridViewCellParsingEventArgs) Handles dgvMain.CellParsing
If e.ColumnIndex = 0 Then
‘ カンマを削除して数値型にパース
Dim rawValue As String = e.Value.ToString().Replace(“,”, “”)
Dim result As Decimal
If Decimal.TryParse(rawValue, result) Then
e.Value = result
e.ParsingApplied = True
End If
ElseIf e.ColumnIndex = 1 Then
‘ 和暦入力をDate型にパース(ここでは簡易的にDate.Parseを使用)
Dim result As Date
If Date.TryParse(e.Value.ToString(), result) Then
e.Value = result
e.ParsingApplied = True
End If
End If
End Sub

—

3. 伝説的エンジニアからの「極限の知見」

このコードを実装する上で、必ず覚えておくべきポイントが3つあります。

① `e.FormattingApplied = True` の重み

これを忘れると、DataGridViewは「自分で描画しなきゃ!」と余計な負荷をかけ続け、最悪の場合、画面がチラついたりパフォーマンスが著しく低下します。「処理は自分でやったから、あとは触るな」という意思表示です。

② 入力バリデーションの責務

`CellParsing`内でパースに失敗した場合、あえて `e.ParsingApplied = False` のままにすることで、DataGridViewはエラー状態(赤いエラーアイコンを表示)を保持します。これが標準のバリデーション機能です。無理に独自メッセージボックスを出す前に、この標準の「赤枠機能」を使いこなしましょう。

③ データソースとの同期

もし `DataTable` 等を `DataSource` に指定している場合、`CellParsing`で戻した値の型が、DataTable側の列の型と一致していることが必須です。ここが不一致だと、セルを抜けた瞬間に例外が発生します。型安全性こそ、VB.NETの最大の武器です。

—

最後に:脱・マクロ記録

マクロの記録から脱却するということは、「見た目の操作」ではなく「データの状態」を管理するという意識への転換です。

DataGridViewは単なる表ではなく、強力なデータ管理オブジェクトです。今回紹介した二つのイベントを制覇すれば、もう「入力フォームとグリッドの値を同期させるコード」に頭を悩ませることはありません。

さあ、あなたのアプリケーションを、よりプロフェッショナルなものへと進化させてください。この領域を理解できれば、あなたはもう初心者ではありません。自信を持って次のステップへ進みましょう。

タイトルとURLをコピーしました