回答編集履歴
2
追記
test
CHANGED
@@ -113,3 +113,41 @@
|
|
113
113
|
End Class
|
114
114
|
|
115
115
|
```
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
### 追記2
|
120
|
+
|
121
|
+
画像の生成が遅いときは必要になってから画像を生成する方法にすると立ち上がりが早くなるかもしれません。サンプルでは早くなりましたが元の画像が重いと効果があるかは分かりません。
|
122
|
+
|
123
|
+
```VB
|
124
|
+
|
125
|
+
Dim i As Integer = 0 '生成した画像の数
|
126
|
+
|
127
|
+
Private Sub ListView1_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles ListView1.RetrieveVirtualItem
|
128
|
+
|
129
|
+
'パスから画像を読み込む場合は事前にファイルのパスのリストを保存しておく
|
130
|
+
|
131
|
+
If e.ItemIndex < 10000 AndAlso e.Item Is Nothing Then
|
132
|
+
|
133
|
+
'i番目の画像を生成する
|
134
|
+
|
135
|
+
Dim thumbnail As New Bitmap(120, 120)
|
136
|
+
|
137
|
+
Using Graphics1 As Graphics = Graphics.FromImage(thumbnail)
|
138
|
+
|
139
|
+
Graphics1.FillRectangle(New SolidBrush(Color.FromArgb(i / 1000 * 25, 0, 0)), New Rectangle(0, 0, 120, 120))
|
140
|
+
|
141
|
+
End Using
|
142
|
+
|
143
|
+
ImageList1.Images.Add(thumbnail)
|
144
|
+
|
145
|
+
e.Item = New ListViewItem(e.ItemIndex.ToString(), e.ItemIndex)
|
146
|
+
|
147
|
+
i += 1
|
148
|
+
|
149
|
+
End If
|
150
|
+
|
151
|
+
End Sub
|
152
|
+
|
153
|
+
```
|
1
追記
test
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
検索のキーワードとしては「.net listview 描画 遅い」で検索するとKOZ6.0さんが質問への追記・修正の依頼にて提示された記事が出てきます。
|
4
4
|
|
5
5
|
試しに使ってみたコードです。[参考にしたサイト](https://www.ipentec.com/document/csharp-listview-using-virtual-listview)
|
6
|
+
|
7
|
+
効果としては120*120のビットマップをListViewに10000件追加する処理で、VirtualModeを使わない場合は3分ちょっとかかっていたのが5秒程度になりました。
|
6
8
|
|
7
9
|
|
8
10
|
|
@@ -59,3 +61,55 @@
|
|
59
61
|
注意事項としてはVirtualModeがTrueのときはListViewのItemsプロパティでのアイテムの追加ができなくなります。
|
60
62
|
|
61
63
|
例ではRetrieveVirtualItemイベントのRetrieveVirtualItemEventArgsを介して、アイテムが未設定であれば新しくアイテムを設定しています。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
### 追記
|
68
|
+
|
69
|
+
比較用のVirtualModeを使わないコード
|
70
|
+
|
71
|
+
```VB
|
72
|
+
|
73
|
+
Public Class Form1
|
74
|
+
|
75
|
+
Private Images As New List(Of Bitmap)
|
76
|
+
|
77
|
+
Private ListViewItems As New List(Of ListViewItem)
|
78
|
+
|
79
|
+
Public Sub New()
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
' この呼び出しはデザイナーで必要です。
|
84
|
+
|
85
|
+
InitializeComponent()
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
' InitializeComponent() 呼び出しの後で初期化を追加します。
|
90
|
+
|
91
|
+
For i As Integer = 0 To 9999
|
92
|
+
|
93
|
+
Dim thumbnail As New Bitmap(120, 120)
|
94
|
+
|
95
|
+
Using Graphics1 As Graphics = Graphics.FromImage(thumbnail)
|
96
|
+
|
97
|
+
Graphics1.FillRectangle(New SolidBrush(Color.FromArgb(i / 1000 * 25, 0, 0)), New Rectangle(0, 0, 120, 120))
|
98
|
+
|
99
|
+
End Using
|
100
|
+
|
101
|
+
Images.Add(thumbnail)
|
102
|
+
|
103
|
+
ListViewItems.Add(New ListViewItem(i.ToString(), i))
|
104
|
+
|
105
|
+
Next
|
106
|
+
|
107
|
+
ImageList1.Images.AddRange(Images.ToArray())
|
108
|
+
|
109
|
+
ListView1.Items.AddRange(ListViewItems.ToArray())
|
110
|
+
|
111
|
+
End Sub
|
112
|
+
|
113
|
+
End Class
|
114
|
+
|
115
|
+
```
|