C#でちょっとしたアプリに、「エクスプローラ風のツリー表示を追加したいっ!!」となったので、簡単に実装できるコントローラについて調査してみました。
Webで調べてみたところ 何種類かありましたが、「ExpTreeLib」が簡単で良さそうだったので試してみました。
のちのち使えるように、メモに残しておきます。
ExpTreeLib
ExpTreeLibは、Visual Studio の 「NuGetパッケージの管理」から追加することが出来ます。
ExpTreeLibの追加
まず、Visual Studioで Formアプリのプロジェクトを作成します。
プロジェクトを作成したら、「メニュー」→「プロジェクト」→「NuGetパッケージの管理」を選択します。
NuGetパッケージ管理が表示されるので、「参照タブ」を選択して、検索欄に「ExpTreeLib」を入力して検索します。
「ExpTreeLib」が表示されるので、インストールして下さい。
Visual Studioの出力欄に「終了」の文字が表示され、緑のチェックが付いたらインストール完了です。
また、ソリューションエクスプローラーのプロジェクトの参照を開いて「ExpTreeLib」が追加されていることを確認して下さい。
以上で準備は完了です。
ExpTreeLibの実装
それでは、ExpTreeLibを実装してエクスプローラに似たツリー表示を実際に試していきます。
といっても、ツールボックスに追加されている「ExpTreeLib」をフォームに追加するだけです。
実行してみると、エクスプローラー風のツリービューが表示されています。
簡単で、カッコイイです。
ListViewを追加
フォームにListViewを追加して、TreeViewで選択したフォルダ配下の一覧を表示するように処理を追加します。
まずは、フォームに「ListView」を追加します。
次に、ツリービューのノード選択時に、ListViewに情報を表示する処理を追加します。
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
}
/// <summary>
/// フォームロード
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
// ツリービューのノード選択イベントハンドラ
this.expTree1.ExpTreeNodeSelected +=
new ExpTreeNodeSelectedEventHandler(this.expTree1_ExpTreeNodeSelected);
expTree1.ExpandANode(@"C:\Users");
}
/// <summary>
/// ツリービューのノードセレクト時処理
/// </summary>
/// <param name="SelPath"></param>
/// <param name="CSI"></param>
private void expTree1_ExpTreeNodeSelected(string SelPath, CShItem CSI)
{
listView1.View = View.Details;
listView1.Clear();
listView1.Columns.Add("名前");
listView1.Columns.Add("種類");
try
{
// フォルダをリストに追加
DirectoryInfo dirInfo = new DirectoryInfo(SelPath);
foreach (DirectoryInfo di in dirInfo.GetDirectories())
{
ListViewItem item = new ListViewItem(di.Name);
item.SubItems.Add("フォルダ");
item.SubItems.Add("");
listView1.Items.Add(item);
}
// ファイルをリスト追加
List<String> fileList = Directory.GetFiles(SelPath).ToList<String>();
foreach (String file in fileList)
{
FileInfo fileInfo = new FileInfo(file);
ListViewItem item = new ListViewItem(fileInfo.Name);
item.SubItems.Add("ファイル");
listView1.Items.Add(item);
}
}
catch (Exception e)
{
}
}
}
簡単にプログラムの説明を記載します。
最初に、19~20行目のフォームロードの記述で、イベントハンドラの登録を行っています。これは、ツリー表示のノードをクリックした際に発生するイベントの登録になります。
「expTree1」は、フォームに張り付けた「ExpTree」の「name」です。
これで、ツリー表示のノードをクリックすると「expTree1_ExpTreeNodeSelected()」関数が呼び出されるようになります。
ちなみに、イベントは以下のように定義されていました。ご参考までに。
public delegate void ExpTreeNodeSelectedEventHandler(string SelPath, CShItem Item);
30~64行目の「expTree1_ExpTreeNodeSelected()」関数では、ツリー表示で選択したフォルダ配下の情報を ListViewに追加する処理になります。
第1引数の「string SelPath」に、選択したフォルダのフルパスが格納されているので、これを使用して、パス配下のフォルダ情報とファイル情報をリストに追加しています。
32行目の「listView1.View = View.Details;」の処理で、「View.Details」の所を変更すると、リストの表示を切り替えることができます。
Viewは以下から選択して下さい。詳細は、「View 列挙型」で検索です。
- Details
- LargeIcon
- List
- SmallIcon
- Tile
以上でプログラムは終了です。実際に起動すると以下のようになります。
後は、ListViewの表示に画像アイコンが付けば、エクスプローラの表示に近づく感じです。
ちなみに、フォームロード処理の22行目にある、以下の処理を記述すると、指定フォルダをオープンした状態で起動できます。
expTree1.ExpandANode(“フォルダパス”);
関数の定義は以下になります。
public bool ExpandANode(string newPath, bool SelectExpandedNode = true)
- 第一引数:指定フォルダパス
- 第二引数:ノード選択イベント発生有無(falseで選択イベント未発生)
例えば、以下にするとアプリケーション起動時に、「ユーザ」フォルダが開かれた状態になります。
expTree1.ExpandANode(@”C:\Users”);
最後に開いたフォルダを記録して、アプリケーション起動時に開くようにできそうです。
簡単、便利、カッコイイです。
ExpTreeLibの最新バージョンについて
ExpTreeLibを使用していて、突然落ちることがあったのでWebで調べてみたところ、Windows10の場合に発生することがあるようです。
Nugetで取得したものは、若干問題が残っているようなので、GitHubから取得したものを使用したほうが良さそうです。
以下のサイトから取得できます。
プロジェクトで提供されていて、ExpTreeLibのソースとDemoプログラムが入っています。DLLだけ使用する場合は、ダウンロードしたプロジェクトを「Releaseビルド」して、作成したDLLを ご使用ください。
また、ExpListLibというエクスプローラーの右側のファイルリスト機能があるコントローラ付きです。自分でListViewを使って実装しなくても良かったっぽいです。
ExpTreeLib と ExpListLib を使用することで、エクスプローラー風の画面が簡単に作成できますので、ぜひお試しください。