✨
作画資料管理ツールを作りたい #01 フォルダのツリービュー作成
はじめに
作りたいもの
作画資料管理ツール
- 画像ファイルをタグで分類できる(pixivやpinterestみたいに)
- サムネイル一覧できる
- 選択画像のプレビューができる
↑ここまでで一旦完成
- 動画も扱う
- 簡単な画像処理もできる(動画のフレームやトリミングもできたらいいな)
- LLM?とかで類似画像の検索ができる
↑これは発展
シリーズ記事一覧
今回
- フォルダのツリービューの作成
能力
- 初心者
- C#とフォームアプリの作り方を勉強する
1. 環境
- Windows 11 pro
- Visual Studio Community 2022 (Version 17.14.12)
- プロジェクトの種類:Windowsフォームアプリ
2. フォームデザイン
主なコントロールと内容
| コントロール | プロパティ | 内容 |
|---|---|---|
| Form | (Name) | Form1 |
| TreeView | (Name) | treeViewDirectory |
起動直後

フォルダ展開

3. ソースコード
-
Form1_Loadイベントハンドラ
addTree_Drive()を呼び出し、TreeViewの最上位にドライブ一覧を構成する。 -
treeViewDirectory_BeforeExpandイベントハンドラ
ツリービューのノードを展開する直前に発生する。
addTree_Child()を呼び出し、展開ドライブまたはフォルダの配下のフォルダ一覧を構成する。
Form1.cs
using System;
using System.Xml.Linq;
namespace ImageViewer01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//ディレクトリのツリー構成
addTree_Drive();
}
private void treeViewDirectory_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (e.Node != null)
{
addTree_Child(e.Node); //イベント元のノード(選択したディレクトリ)を渡す
}
else
{
System.Diagnostics.Debug.WriteLine("e.Node: null ");
}
}
//ツリービューにノード(ドライブ名)を追加
private void addTree_Drive()
{
string[] dirveList = Environment.GetLogicalDrives(); //ドライブ名一覧を取得
foreach (string drive in dirveList)
{
// \除去(C:\ → C:)
// …をしたが、後のGetDirectories()でうまく取得できないドライブがある
//string drive = drive.Substring(0, drive.Length - 1);
string str = drive;
TreeNode tNode = new(str, 0, 0); //ノードにドライブアイコンを設定
treeViewDirectory.Nodes.Add(tNode); //親ノードにドライブを設定
//ダミーノード追加
if (treeViewDirectory.Nodes.Count != 0)
{
tNode.Nodes.Add("...");
}
}
}
//ツリービューにノード(ディレクトリ名)を追加
private void addTree_Child(TreeNode treeParent)
{
TreeNode treeChild;
DirectoryInfo dirInfo = new(treeParent.FullPath); //子ディレクトリ一覧を取得(展開する親ディレクトリのフルパスを指定)
treeParent.Nodes.Clear(); //ダミーノードを消去
//サブディレクトリのノード追加
try
{
foreach (DirectoryInfo subDir in dirInfo.GetDirectories()) //※光学ドライブだと例外発生
{
treeChild = new TreeNode(subDir.Name, 1, 2);
treeParent.Nodes.Add(treeChild);
//ダミーノード追加
if (treeParent.Nodes.Count != 0)
{
treeChild.Nodes.Add("...");
}
}
}
catch (IOException ex) {
string msg = "!!デバイスの準備ができていません";
treeChild = new TreeNode(msg, 1, 2);
treeParent.Nodes.Add(treeChild);
}
}
}
}
参考にさせていただきました
おわり
ドライブやフォルダのアイコン表示、ダウンロードやお気に入りなのどのノード追加、その他細かいことは後回しにしました。
そして、もう大量の画像一覧するところでブラックホールに吸われる未来が見えている。
Discussion