[C#][Windows Formsアプリ][ComboBox] BeginUpdateとEndUpdateを使用して大量項目を追加する

スポンサーリンク

はじめに

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(); // 必ず呼ばれる
}
⚠️ UI フリーズを避けるために、BeginUpdate と 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.AddInsert とは仕組みが異なりますが、
再描画抑制という意味では有効です。
ただし、データの追加自体は 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 を触っている
✔ UI が重く感じたら、まずは BeginUpdate を試してみましょう!

 

まとめ

  • BeginUpdate() → 描画更新を止めて処理を高速化
  • EndUpdate() → 描画再開
  • 大量データ追加では必須。ちらつき防止にも効果的。
  • Sorted = true のときは追加ごとに再ソートされるため注意。
  • DataSource 使用時も再描画抑制に有効。
  • 最後は try/finally で確実に EndUpdate を呼ぶ。

大量データを扱う UI では、BeginUpdate / EndUpdate の有無で
体感速度が大きく変わります
ComboBox のパフォーマンス改善の基本テクニックとして、ぜひ覚えておきましょう!

Please follow and like us:

コメント

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