通常、リストボックス(またはコンボボックス)に項目を追加するには、リストボックスコントロールのItems.Addメソッドで行います。複数項目を追加する時でも、For...Nextを使い、Items.Addメソッドにより一つ一つ追加していけばよいのですが、あまりに追加する項目の数が多いと処理にかなりの時間がかかります。
そのような時は、BeginUpdateメソッドを使用して項目追加時のリストボックスの再描画を禁止することにより、より速く複数の項目を追加することが出来るようになります。さらに、ちらつきもなくなります。
また、追加する項目が配列またはListBox.ObjectCollectionクラスの場合は、Items.AddRangeメソッドを使ってリストに追加するのがよいでしょう。
次の例では、リストボックスコントロールListBox1に、String型配列ssの内容を表示する3通りの方法を示し、それぞれの処理にかかった時間を計測しています。このコードを実行すれば、これらの方法を使用したほうがかなり速いということがお分かりいただけるでしょう。
'リストボックスに追加する文字列配列を作成 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)
//リストボックスに追加する文字列配列を作成 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);
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。