ListViewのアイテム登録は工夫しないと遅いです。
10000件のアイテム登録のサンプルを作ってみました。

Public Class Form1
''' <summary>
''' 普通にデータ登録
''' </summary>
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim item As ListViewItem
Dim sw As Stopwatch = Stopwatch.StartNew
ListView1.Items.Clear()
For i As Integer = 1 To 10000
item = ListView1.Items.Add(i.ToString("D6"))
item.SubItems.Add("2")
item.SubItems.Add("3")
Next
ListView1.EnsureVisible(ListView1.Items.Count - 1)
sw.Stop()
Console.WriteLine("Button1: " & sw.ElapsedMilliseconds & "ms")
End Sub
''' <summary>
''' データ登録が終わるまで描画をストップ
''' </summary>
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim item As ListViewItem
Dim sw As Stopwatch = Stopwatch.StartNew
ListView1.BeginUpdate()
ListView1.Items.Clear()
For i As Integer = 1 To 10000
item = ListView1.Items.Add(i.ToString("D6"))
item.SubItems.Add("2")
item.SubItems.Add("3")
Next
ListView1.EnsureVisible(ListView1.Items.Count - 1)
ListView1.EndUpdate()
sw.Stop()
Console.WriteLine("Button2: " & sw.ElapsedMilliseconds & "ms")
End Sub
''' <summary>
''' リストにデータを登録した後、リストビューにまとめて登録
''' </summary>
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim item As ListViewItem
Dim items As New List(Of ListViewItem)
Dim sw As Stopwatch = Stopwatch.StartNew
ListView1.BeginUpdate()
ListView1.Items.Clear()
For i As Integer = 1 To 10000
item = New ListViewItem(i.ToString("D6"))
item.SubItems.Add("2")
item.SubItems.Add("3")
items.Add(item)
Next
ListView1.Items.AddRange(items.ToArray)
ListView1.EnsureVisible(ListView1.Items.Count - 1)
ListView1.EndUpdate()
sw.Stop()
Console.WriteLine("Button3: " & sw.ElapsedMilliseconds & "ms")
End Sub
End Class
結果は…
Button1: 14835ms
Button2: 3698ms
Button3: 1940ms
Button1: 15506ms
Button2: 4139ms
Button3: 1960ms
Button3が一番早いです。
Button3のBeginUpdate、EndUpdateはなくてもあまり変わりません。
おまけ…登録スピードにはあまり影響しないですけど、サブアイテム登録のサンプルも置いときます。コーディングには好みがありますけどボクはこっちで登録してます。
item.SubItems.AddRange(New String() {
"2",
"3"
})
コメント