【入門編】DataGridViewの行ヘッダーを活用したカスタム行番号表示とバリデーションステータスアイコンの描画テクニック – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

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つをマスターするだけで、あなたの作るアプリケーションは、単なる「入力フォーム」から「業務を支える頼れるツール」へと進化します。

「コードを書いて終わり」ではなく、「どう動くのが一番心地よいか」を常に考え続けてください。それが、優れた自動化エンジニアへの第一歩です。

何か不明点があれば、いつでも聞いてください。あなたの成長を心から応援していますよ。

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