はじめに
ComboBox に大量の項目を追加するとき、画面がちらつく、動作が重い、
といった問題が起きることがあります。
この問題を解決し、項目追加を高速化してくれるのが
BeginUpdate() と EndUpdate() です。
- BeginUpdate() → ComboBox の描画を一時停止する
- EndUpdate() → 描画を再開する
この間に大量追加すると、サクサク処理できる!
BeginUpdate / EndUpdate の役割
| メソッド | 説明 |
|---|---|
BeginUpdate() |
ComboBox の再描画を一時停止して、高速に項目を更新できるようにする。 |
EndUpdate() |
停止していた再描画を再開し、画面表示を最新状態にする。 |
大量の Items.Add() や Items.Insert() を行うと、
1件ずつ再描画されてしまうため、処理が遅くなったり画面がちらつきます。
そこで、まとめて処理するために BeginUpdate() を使います。
基本的な使い方
comboBox1.BeginUpdate();
for (int i = 0; i < 1000; i++)
{
comboBox1.Items.Add($"項目 {i}");
}
comboBox1.EndUpdate();
このように、更新処理の前後を BeginUpdate() / EndUpdate() で挟むだけ。
これだけで描画更新が抑えられ、処理が格段に高速になります。
Try / Finally で確実に EndUpdate を呼ぶ
大量追加の途中で例外が起きると、EndUpdate() が呼ばれず描画が止まったままになることがあります。
必ず finally に書くようにしましょう。
comboBox1.BeginUpdate();
try
{
for (int i = 0; i < 1000; i++)
{
comboBox1.Items.Add($"項目 {i}");
}
}
finally
{
comboBox1.EndUpdate(); // 必ず呼ばれる
}
Sorted = true の場合の注意点
Sorted = true の状態だと、項目が追加されるたびに
再ソートが発生します。
大量データのときはさらに遅くなるため、以下のようにするのがおすすめです。
// 1. いったんソートをOFFにする
comboBox1.Sorted = false;
comboBox1.BeginUpdate();
try
{
for (int i = 0; i < 1000; i++)
{
comboBox1.Items.Add($"データ {i}");
}
}
finally
{
comboBox1.EndUpdate();
}
// 2. 全部追加し終わってから自分でソート
comboBox1.Sorted = true;
この方法は、大量データを扱う場合の必須テクニックです。
DataSource 使用時は意味がある?
DataSource を使っている場合、Items.Add や Insert とは仕組みが異なりますが、
再描画抑制という意味では有効です。
ただし、データの追加自体は Items ではなくデータ元(List や DataTable)に対して行います。
comboBox1.BeginUpdate();
myList.Add("新しいデータ");
comboBox1.DataSource = null;
comboBox1.DataSource = myList;
comboBox1.EndUpdate();
大量追加時に再描画を抑える効果があります。
実用例:高速データ読み込み ComboBox
例:ID + 名前の大量データをコンボに登録する処理
private void LoadCustomers()
{
comboBox1.BeginUpdate();
try
{
comboBox1.Items.Clear();
for (int i = 1; i <= 5000; i++)
{
comboBox1.Items.Add($"顧客ID:{i} 名前:ユーザー{i}");
}
}
finally
{
comboBox1.EndUpdate();
}
}
BeginUpdate を使うことで、5000件の追加でもスムーズに完了します。
BeginUpdate が特に効果を発揮するケース
- 大量データ(100件以上)を Add / Insert する
- Items.Clear → AddRange のように連続更新する
- 更新中にちらつきが発生する
- リストを何度も作り直している
- Timer やイベントで頻繁に Items を触っている
まとめ
- BeginUpdate() → 描画更新を止めて処理を高速化
- EndUpdate() → 描画再開
- 大量データ追加では必須。ちらつき防止にも効果的。
- Sorted = true のときは追加ごとに再ソートされるため注意。
- DataSource 使用時も再描画抑制に有効。
- 最後は try/finally で確実に EndUpdate を呼ぶ。
大量データを扱う UI では、BeginUpdate / EndUpdate の有無で
体感速度が大きく変わります。
ComboBox のパフォーマンス改善の基本テクニックとして、ぜひ覚えておきましょう!
コメント