DataGridViewを「操る」—行番号と警告アイコンを極限まで最適化する実装術
こんにちは。現場で叩き上げ、数々のレガシーシステムを現代的なUIへと昇華させてきたエンジニアです。
今日は、多くの開発者が苦戦する「DataGridViewのパフォーマンス」と「直感的なバリデーション(入力チェック)」を両立させる、プロのテクニックを伝授します。
マクロの記録から一歩先へ進みたいあなた。「DataGridViewは、ただの表ではありません。描画の仕組みを理解すれば、最強の武器になる」ということを、今日ここで体験してください。
—
なぜ「セルに直接行番号を書く」と重くなるのか?
初心者がやりがちなのは、データバインドのタイミングで行番号をセルに書き込む方法です。しかし、データが数千、数万行になると、スクロールのたびに再計算が走り、アプリケーションは重くなります。
私たちが目指すのは、「描画の瞬間にだけ、必要な分だけ描画する」というアプローチです。これを実現するのが `RowPostPaint` イベントです。
—
1. 行番号を動的描画する「RowPostPaint」の魔法
`RowPostPaint` イベントは、行が描画される直前に呼び出されます。ここに処理を記述することで、メモリを無駄に消費せず、常に最新の行番号を表示し続けることができます。
実装コード
Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint
‘ 行番号を文字列として作成(インデックス + 1)
Dim rowIdx As String = (e.RowIndex + 1).ToString()
‘ 描画用のフォントとブラシを定義
Dim centerFormat As New StringFormat() With {
.Alignment = StringAlignment.Center,
.LineAlignment = StringAlignment.Center
}
‘ ヘッダーの描画エリアを取得して描画
Dim headerBounds As Rectangle = New Rectangle(e.RowBounds.Left, e.RowBounds.Top, DataGridView1.RowHeadersWidth, e.RowBounds.Height)
e.Graphics.DrawString(rowIdx, Me.Font, SystemBrushes.ControlText, headerBounds, centerFormat)
End Sub
このコードの本質
- メモリ節約: 行データを保持する列を増やす必要はありません。
- 追従性: 並び替え(ソート)をしても、このイベントは常に現在の「表示位置」を検知して描画し直すため、行番号がズレることはありません。
—
2. 警告アイコンで「修正漏れ」を物理的に防ぐ
入力値にエラーがある場合、いちいちポップアップを出すのはユーザー体験(UX)を損ないます。「ヘッダーにアイコンを出す」のが最もスマートな解決策です。
同じく `RowPostPaint` を拡張し、エラー判定フラグ(例えば `HasError` というプロパティ)を見てアイコンを描画します。
警告アイコンの描画ロジック
‘ 行の状態を判定するロジック(例)
If MyDataList(e.RowIndex).HasError Then
‘ 警告アイコンを描画
Dim iconRect As New Rectangle(e.RowBounds.Left + 5, e.RowBounds.Top + 5, 16, 16)
e.Graphics.DrawIcon(SystemIcons.Warning, iconRect)
End If
—
現場で陥りやすい「落とし穴」と対策
ここをクリアすれば、あなたは中級者の扉を叩いたことになります。
落とし穴1:再描画のタイミング
「データが更新されたのにアイコンが消えない!」というケースがあります。これは `DataGridView.Invalidate()` を呼ぶことで解決します。データ更新処理の最後にこのメソッドを呼ぶことで、画面に「もう一度描画し直して!」という指示を送れます。
落とし穴2:描画オブジェクトの解放忘れ
`Graphics` オブジェクトや `StringFormat` は、大量に生成するとメモリリークの原因になります。
- `Using` ブロックを使って、使い終わったら即座に解放する癖をつけてください。
- 今回のサンプルは簡略化していますが、複雑な描画をする際は必須の知識です。
—
まとめ:UIは「対話」である
Visual BasicやVB.NETで最も重要なのは、「ユーザーが次に何をすべきかを直感的に伝えること」です。
1. `RowPostPaint` で描画をコントロールし、軽快さを保つ。
2. ヘッダーの余白を情報提示スペースとして活用する。
この2つをマスターするだけで、あなたの作るアプリケーションは、単なる「入力フォーム」から「業務を支える頼れるツール」へと進化します。
「コードを書いて終わり」ではなく、「どう動くのが一番心地よいか」を常に考え続けてください。それが、優れた自動化エンジニアへの第一歩です。
何か不明点があれば、いつでも聞いてください。あなたの成長を心から応援していますよ。
