【入門編】DataGridViewの大量行一括更新におけるパフォーマンス劣化の解消:BindingListとSuppressNotificationの極意 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

数万件のデータを一瞬で描画せよ。DataGridViewの「フリーズ」を解消する魔法の極意

こんにちは。現場で「画面が固まるんですけど……」という悲鳴を何度聞いたかわかりません。

VB.NETでWindows Formsを扱う際、`DataGridView`に数万件のデータを流し込むと、UIが完全にフリーズしますよね。これは「データが更新されるたびに、画面が再計算・再描画を行っている」からです。

今日は、マクロの記録から脱却し、真のエンジニアとして「データバインディング」の裏側を支配する技術を伝授します。

—

なぜDataGridViewは「フリーズ」するのか?

結論から言えば、「通知の嵐」が原因です。

通常、`BindingList(Of T)` を使ってデータを追加すると、1行追加するたびに「変更がありました!」というイベントが発行されます。DataGridViewは健気にも、そのたびに「承知しました!画面を更新します!」と再描画を繰り返します。

数万件のデータを追加する際、1件ごとに再描画していれば、PCが悲鳴を上げるのは当然ですよね。

解決の鍵は「沈黙(Suppress Notification)」

この「変更通知」を一時的に止めてしまえばいいのです。全てのデータを流し込んだ後に、最後に一回だけ「全部更新されましたよ!」と通知する。これがパフォーマンス最適化の極意です。

—

現場で即戦力となる最適化コード

まずは、標準的な実装と、それを最適化したコードを見比べてみましょう。

1. 【NG例】愚直にAddし続ける(フリーズの原因)

‘ 数万件あると、ここが地獄の遅さになる
For Each item In largeDataList
myBindingList.Add(item)
Next

2. 【推奨】BindingListを拡張し、通知を制御する

`BindingList(Of T)` を継承して、`RaiseListChangedEvents` フラグを操作するクラスを作るのが最もエレガントです。

Imports System.ComponentModel

‘ 通知を一時停止できる特別なBindingList
Public Class FastBindingList(Of T)
Inherits BindingList(Of T)

‘ 通知の有効/無効を切り替えるメソッド
Public Sub SuspendNotifications()
Me.RaiseListChangedEvents = False
End Sub

Public Sub ResumeNotifications()
Me.RaiseListChangedEvents = True
‘ 最後に一括で更新通知を出す
Me.ResetBindings()
End Sub
End Class

3. 実践:数万件の一括挿入

このクラスを使って、UIを止めずにデータを流し込みます。

‘ インスタンス化
Dim myData As New FastBindingList(Of MyDataModel)
DataGridView1.DataSource = myData

‘ — ここからが魔法の処理 —
‘ 1. 通知を停止
myData.SuspendNotifications()

‘ 2. 高速なデータ読み込み
For Each item In largeDataList
myData.Add(item)
Next

‘ 3. 通知を再開(ここで一気に描画される)
myData.ResumeNotifications()

—

ここをクリアすれば、あなたはもう「中級者」です

この手法を理解する上で、以下の3つのポイントを押さえてください。

1. RaiseListChangedEventsプロパティ: これが「変更通知スイッチ」です。`False`にすることで、裏側のリストは更新されても、UIには何も通知されません。
2. ResetBindings()メソッド: これが「最終通知」です。UIに対して「今のリストの状態を全部見直して!」と伝えるための司令塔です。
3. UIスレッドの保護: 今回のような大量処理は、できれば `Task.Run` などを使って別スレッドで処理し、最後に `Invoke` でUIに反映させるのが理想です。しかし、まずはこの「通知制御」を完璧にマスターしてください。

—

最後に:エンジニアとしての視点

「コードが動くこと」と「ユーザーを待たせないこと」の間には、埋められない深い溝があります。

VB.NETは古い言語だと言われることもありますが、オブジェクトのライフサイクルやイベント駆動の仕組みを深く理解すれば、最新のフレームワークにも劣らない強力なツールになります。

「なぜ遅いのか?」「どこで無駄な命令が走っているのか?」という視点を持つこと。それだけで、あなたの書くプログラムは劇的に変わります。

さあ、次はあなたのプロジェクトで、この「通知制御」を試してみてください。画面がサクサク動く快感を知れば、もう前のやり方には戻れないはずですよ。

質問があれば、いつでも聞いてください。一緒に最強のアプリケーションを作り上げましょう!

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