こんにちは。現場で叩き上げ、数多のレガシーシステムを現代的なアーキテクチャへと昇華させてきたエンジニアです。
今日は、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は単なる表ではなく、強力なデータ管理オブジェクトです。今回紹介した二つのイベントを制覇すれば、もう「入力フォームとグリッドの値を同期させるコード」に頭を悩ませることはありません。
さあ、あなたのアプリケーションを、よりプロフェッショナルなものへと進化させてください。この領域を理解できれば、あなたはもう初心者ではありません。自信を持って次のステップへ進みましょう。
