【入門編】DataGridViewのパフォーマンス爆速化:仮想モード(VirtualMode)の導入と大量データ描画のメモリ最適化 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは。現場の最前線でコードを書き続けているエンジニアです。

Windows Formsで開発をしていると、必ず一度はぶつかる壁があります。それが「DataGridViewに数万件のデータを読み込んだ瞬間にアプリがフリーズする」という現象です。

「データバインドして終わり」だと思っていませんか? それ、実はメモリの爆弾を抱えているのと同じです。今日は、プロの現場で必須となる「仮想モード(VirtualMode)」を使い、数万件のデータを軽快に捌くための極意を伝授します。

なぜ、DataGridViewは「普通」に使うと重いのか?

通常、`DataSource`にリストを渡すと、DataGridViewは全ての行オブジェクトを生成し、メモリ上に展開しようとします。1万件のレコードがあれば、1万個のセルオブジェクトがメモリを占拠する。これでは、PCのメモリがいくらあっても足りませんし、描画のたびに再計算が走り、動きが鈍くなるのは当然です。

私たちが目指すのは「必要な時だけ、必要な分だけデータを取り出す」という、いわば「オンデマンド型」のUI設計です。

仮想モード(VirtualMode)という「魔法」の正体

仮想モードとは、DataGridViewに「データの実体」を持たせず、「表示が必要なときだけイベントを飛ばして、その行のデータを教えてくれ」と要求するモードのことです。

仕組みは簡単です。
1. `VirtualMode = True` に設定する。
2. `CellValueNeeded` イベントを購読する。
3. 指定されたインデックス(行・列)に対応するデータを、手元のメモリからサッと渡す。

これだけで、たとえ100万件あってもメモリ消費量はほぼ一定になります。

実践:爆速DataGridViewのコード実装

以下のコードは、数万件のデータをメモリ上のリストから仮想的に表示するテンプレートです。

‘ 【重要】フォームのコンストラクタやLoadイベントで設定
Private Sub SetupDataGridView()
‘ 仮想モードを有効化
DataGridView1.VirtualMode = True

‘ 行数を事前に設定(これだけでスクロールバーが正しく動作します)
DataGridView1.RowCount = 100000 ‘ 10万件あっても一瞬です
End Sub

‘ 描画のたびに呼ばれる「魔法のイベント」
Private Sub DataGridView1_CellValueNeeded(sender As Object, e As DataGridViewCellValueEventArgs) Handles DataGridView1.CellValueNeeded
‘ 範囲外なら何もしない
If e.RowIndex < 0 OrElse e.RowIndex >= myDataList.Count Then Return

‘ myDataListはあらかじめメモリに読み込んでおいたList(Of DataModel)など
Dim item = myDataList(e.RowIndex)

‘ 列のインデックスを見て、どのプロパティを渡すか分岐
Select Case DataGridView1.Columns(e.ColumnIndex).Name
Case “ColID”
e.Value = item.ID
Case “ColName”
e.Value = item.Name
End Select
End Sub

このコードのポイント

  • RowCountの固定: `VirtualMode`をONにすると、`DataSource`を使わないため、自分で`RowCount`を指定する必要があります。これだけでスクロールバーが自動計算されます。
  • CellValueNeededの効率化: ここで複雑な計算やDBアクセスをしてはいけません。メモリ上のリスト(`List(Of T)`)から値を返すだけに留めるのが、サクサク動かす秘訣です。

陥りやすい罠:ここだけは気をつけて!

初心者の頃によくやってしまうミスが、このイベントの中で「重い処理」をしてしまうことです。

  • 罠1:DBへの直接アクセス

`CellValueNeeded`はスクロールするたびに何百回と呼び出されます。ここでSQLを発行すると、スクロールするたびにアプリが固まります。データは必ず事前にメモリ(`List`等)にロードしておいてください。

  • 罠2:型変換の多用

`e.Value`に渡す際は、なるべく計算を減らします。`item.ToString()`などを頻繁に行うと、CPU負荷が積み重なり、描画の滑らかさが失われます。

まとめ:エンジニアとして一段上のステージへ

仮想モードを使いこなすということは、「PCのリソースを支配する」ということです。

「とりあえず動けばいい」というコードから、「メモリ効率とユーザー体験を最適化した」コードへ。この一歩を踏み出せたなら、あなたはもうマクロの記録から脱却した、立派なVB.NETエンジニアです。

数万件のデータを扱っても、まるで数件のデータを扱っているかのような軽快さ。それを実現したときの感動は、ぜひご自身の環境で体感してください。

ここをクリアすれば、Windows Formsの設計は怖くありません。また次の技術でお会いしましょう!

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