DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ListBox(またはComboBox)に複数の項目をより速く追加する

通常、リストボックス(またはコンボボックス)に項目を追加するには、リストボックスコントロールのItems.Addメソッドで行います。複数項目を追加する時でも、For...Nextを使い、Items.Addメソッドにより一つ一つ追加していけばよいのですが、あまりに追加する項目の数が多いと処理にかなりの時間がかかります。

そのような時は、BeginUpdateメソッドを使用して項目追加時のリストボックスの再描画を禁止することにより、より速く複数の項目を追加することが出来るようになります。さらに、ちらつきもなくなります。

また、追加する項目が配列またはListBox.ObjectCollectionクラスの場合は、Items.AddRangeメソッドを使ってリストに追加するのがよいでしょう。

次の例では、リストボックスコントロールListBox1に、String型配列ssの内容を表示する3通りの方法を示し、それぞれの処理にかかった時間を計測しています。このコードを実行すれば、これらの方法を使用したほうがかなり速いということがお分かりいただけるでしょう。

VB.NET
コードを隠すコードを選択
'リストボックスに追加する文字列配列を作成
Dim ss(10000) As String
Dim i As Integer
For i = 0 To ss.Length - 1
    ss(i) = i.ToString()
Next

Dim startTime As Integer
Dim endTime As Integer

'Addで一つ一つ追加
ListBox1.Items.Clear()
startTime = Environment.TickCount
'配列の内容を一つ一つ追加する
For i = 0 To ss.Length - 1
    ListBox1.Items.Add(ss(i))
Next
endTime = Environment.TickCount
Console.WriteLine("1:{0}ミリ秒", endTime - startTime)

'Addで一つ一つ追加
'BeginUpdateを使用
ListBox1.Items.Clear()
startTime = Environment.TickCount
'再描画しないようにする
ListBox1.BeginUpdate()
'配列の内容を一つ一つ追加する
For i = 0 To ss.Length - 1
    ListBox1.Items.Add(ss(i))
Next
'再描画するようにする
ListBox1.EndUpdate()
endTime = Environment.TickCount
Console.WriteLine("2:{0}ミリ秒", endTime - startTime)

'AddRangeで一度に追加
ListBox1.Items.Clear()
startTime = Environment.TickCount
'配列の内容を一度に追加する
ListBox1.Items.AddRange(ss)
endTime = Environment.TickCount
Console.WriteLine("3:{0}ミリ秒", endTime - startTime)
C#
コードを隠すコードを選択
//リストボックスに追加する文字列配列を作成
string[] ss = new string[10000];
for (int i  = 0; i  <= ss.Length - 1; i ++)
{
    ss[i] = i.ToString();
}

int startTime;
int endTime;

//Addで一つ一つ追加
ListBox1.Items.Clear();
startTime = Environment.TickCount;
//配列の内容を一つ一つ追加する
for (int i  = 0; i  <= ss.Length - 1; i ++)
{
    ListBox1.Items.Add(ss[i]);
}
endTime = Environment.TickCount;
Console.WriteLine("1:{0}ミリ秒", endTime - startTime);

//Addで一つ一つ追加
//BeginUpdateを使用
ListBox1.Items.Clear();
startTime = Environment.TickCount;
//再描画しないようにする
ListBox1.BeginUpdate();
//配列の内容を一つ一つ追加する
for (int i  = 0; i  <= ss.Length - 1; i ++)
{
    ListBox1.Items.Add(ss[i]);
}
//再描画するようにする
ListBox1.EndUpdate();
endTime = Environment.TickCount;
Console.WriteLine("2:{0}ミリ秒", endTime - startTime);

//AddRangeで一度に追加
ListBox1.Items.Clear();
startTime = Environment.TickCount;
//配列の内容を一度に追加する
ListBox1.Items.AddRange(ss);
endTime = Environment.TickCount;
Console.WriteLine("3:{0}ミリ秒", endTime - startTime);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。