プログラミングの魔物

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

C#のListView

ちょっとしたツールを作るためにListViewを使用中。そのメモ。

公式のヘルプ。
http://msdn.microsoft.com/ja-jp/library/ms750972.aspx

@ITの記事
http://www.atmarkit.co.jp/fdotnet/dotnettips/336listviewimage/listviewimage.html

LargeIconを表示する場合、ListViewとは別にコンポーネントからImageListを追加、あるいはプログラム上で宣言する。
この辺の仕様をスッキリする方法は無いものか。

テスト表示してみたら色数が少なかった。ImageListのColorDepthをDepth24Bitにする(32Bitだと透過も扱える)
アイテムを削除した時のListViewとImageListの整合性ってどう処理すればいいのやら。ListViewのImageIndexでImageListから削除すればいいのだろうか?


ドラッグアンドドロップでファイルを追加できるようにしてポイポイ放り込む。
http://www.atmarkit.co.jp/fdotnet/csharptips/003dragdrop/003dragdrop.html


標準のままのListViewで数千の画像ファイルを表示しようとすると結構時間が掛かる。VirtualModeで表示している部分だけを処理するようにすれば解決するはず。
しかし自分用のツールなので気にせず作る。

アイテムを作る時はこんな感じで

ListViewItem item = new ListViewItem(Path.GetFileName(fullpath), imageList1.Images.Count - 1);
item.Name = fullpath;
listView1.Items.Add(item);

Nameプロパティにフルパスを持つことでlistView1.Items.ContainsKeyによってListViewにすでに含まれているかをチェックできる。
これにより重複登録のチェックがしやすくなる。

チラツキを抑えるためのダブルバッファ
http://amonution.sblo.jp/article/45398035.html

ダブルバッファ&Application.DoEvents()で読み込みごとに更新することで大量のファイルの読み込みも経過が表示されるようになりストレスフリー。

ダブルバッファを有効にする方法にはこういうのもあるのか。メモメモ。
これならサブクラスを作らずに有効にできる。

using System.Reflection;

public static void EnableDoubleBuffer(Control c)
{
	PropertyInfo prop = c.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
	prop.SetValue(c, true, null);
}

http://d.hatena.ne.jp/m_kawanon/20100708/1278587297