読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

ListViewの続き

やはりファイル数が多いのでListViewにVirtualModeをサクッと導入することにした。

その前にWindows環境にGitを入れてバージョン管理してみることに。
今までTortoiseSVNを入れていたのでその流れでTortoiseGitを入れた。
http://code.google.com/p/tortoisegit/

入れ方に関して
http://www.02.246.ne.jp/~torutk/git/gitonwindows.html

使い方
http://sourceforge.jp/magazine/09/06/19/0340248


昨日のListViewとImageListの整合性に対する疑問だが、ImageListはアイコンキャッシュと考えるとListViewの項目は整合性を気にすることなく削除すれば良さそうだ。
その場合は追加する画像をImageListと照合してキャッシュされていればそれを表示するようにすれば読み込みの効率も上がる。
実際はImageListに追加する時にImageList.Images.Add(キー文字列, image)として、imageList1.Images.IndexOfKeyで-1かどうかをチェックする。

今日扱うのはVirtualModeなので、表示した画像をImageListに随時キャッシュして行く形にしてみる。

いよいよ本題のVirtualMode
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.virtualmode.aspx

VirtualListSizeでリストのサイズを設定。
RetrieveVirtualItemイベントで指定されたインデックスのListViewItemを返す。
CacheVirtualItemsイベントでListViewItemオブジェクトをキャッシュする。
今回はSearchForVirtualItemを使わない。SearchForVirtualItemはFindItemWithTextやFindNearestItemを処理する場合は必要。

とても早い。VirtualModeにしてよかった。


C#の設定ファイル
http://www.atmarkit.co.jp/fdotnet/dotnettips/562appsettings2/appsettings2.html


VirtualModeに移行する時にちょっと嵌ったのが、RetrieveVirtualItemイベントの中でApplication.DoEvents()を呼んでしまったこと。
これを行うと表示するListViewItemの用意が出来ていない内に画面更新のイベントが処理されるため、ListViewItemが用意されていないというエラーが出る。
エラーが出るタイミングもバラバラなので少し厄介だった。