作画資料管理ツールを作りたい #01 フォルダのツリービュー作成

に公開

はじめに

作りたいもの

作画資料管理ツール

  • 画像ファイルをタグで分類できる(pixivやpinterestみたいに)
  • サムネイル一覧できる
  • 選択画像のプレビューができる

↑ここまでで一旦完成

  • 動画も扱う
  • 簡単な画像処理もできる(動画のフレームやトリミングもできたらいいな)
  • LLM?とかで類似画像の検索ができる

↑これは発展

シリーズ記事一覧

https://zenn.dev/indonegiyan/articles/77062311f8755e

今回

  • フォルダのツリービューの作成

能力

  • 初心者
  • C#とフォームアプリの作り方を勉強する

1. 環境

  • Windows 11 pro
  • Visual Studio Community 2022 (Version 17.14.12)
  • プロジェクトの種類:Windowsフォームアプリ

2. フォームデザイン

主なコントロールと内容

コントロール プロパティ 内容
Form (Name) Form1
TreeView (Name) treeViewDirectory


起動直後
起動直後-ドライブ一覧


フォルダ展開
フォルダ展開

3. ソースコード

  1. Form1_Loadイベントハンドラ
    addTree_Drive()を呼び出し、TreeViewの最上位にドライブ一覧を構成する。

  2. 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);
            }
        }

    }
}


参考にさせていただきました

https://www.kisoplus.com/sample/

おわり

ドライブやフォルダのアイコン表示、ダウンロードやお気に入りなのどのノード追加、その他細かいことは後回しにしました。
そして、もう大量の画像一覧するところでブラックホールに吸われる未来が見えている。

Discussion