VC#2005EEでエクスプローラー風のツリービューを実装

 NetBeensとVisualC++2005EEをアンインストールして空いたスペースにVisualC#2005EEをインストールしました。VC#をインストールして最初に書いたのは、フォルダの階層を表示出来るツリービューのDLLです。

 aniscapeのお気に入りツリーをVB.NETで作ったときにちょっと大変だったので、C#で書いてDLLとして残しておこうと思いました。

 再帰処理でフォルダ階層を奥まで読んでゴリゴリとノードを追加していけば簡単なのですが、そうすると全てのノードを追加し終わるまで暫く時間が掛かります。とても実用になりません。

 それなら、ノードを開くときにその下だけ読めばもっと簡単だし、最初の待ち時間もありません。でも、それにも問題があります。ノードの頭についている+-のマークが表示されないので、フォルダの下にファイルやフォルダがあるかどうかが分かりません。

 それではどうするのかと言うと、ノードを開く度に、2階層下まで読み込みます。

 ファイルを表示するのですから、アイコンも表示させた方がいいと思います。

Icon icon = Icon.ExtractAssociatedIcon(“FileName”);

でそのファイルのアイコンを取得出来ます。これを

TreeView.ImageList.Images.Add(“FileName”, icon);

でイメージリストに追加して

TreeNode.ImageKey = “FileName”;

TreeNode.SelectedImageKey = “FileName”;

でノードにアイコンを設定します。

 ここで問題発生です。この一連の処理がとても重いのです。ノードをクリックしてから開くまでに数秒から十数秒掛かります。使い物になりません。

 そこでもう少し改造します。+-マークを表示させる為には2階層下まで読む必要がありますが、2階層下のノードについてはアイコンが無くても問題ありません。そこで、ノードは2階層下まで追加するが、アイコンは1階層下のみ追加する仕様にしました。

 これで、軽快とはいきませんが、使えるレベルまでレスポンスが良くなりました。後はもっとレスポンスが必要な場合の為に、ファイルごとにアイコンを取得しないようにするプロパティでも実装しておけば幅広く使える様になるでしょう。

以上、メモでした。

ソースコード(C#, .NET2.0)

AnisTreeView.cs

バイナリ

AnisTreeView.zip

 大量にノードを開いた時のレスポンスを改善しました。

バイナリ

AnisTreeView1_1_0_0.zip

ソースコード(C#, .NET2.0)

AnisTreeView1_1_0_0.cs

VC#2005EEでエクスプローラー風のツリービューを実装」への3件のフィードバック

    1. すみません。何度か移転を繰り返すうちにファイルを紛失してしまったようです。
      ただ、今考えると2階層下までのファイルツリーを取得するのは悪手だったように思います。
      http://uchukamen.com/Programming1/TreeViewByDk/index.htm
      こちらの様なダミーを入れる方法の方が実装がシンプルでパフォーマンスも出る筈なので参考にされてみては如何でしょうか?

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください