回答編集履歴

2

追記

2021/12/31 02:41

投稿

vann_2921
vann_2921

スコア190

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

追記

2021/12/31 02:41

投稿

vann_2921
vann_2921

スコア190

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
+ ```