【C#】TreeView と ListView でエクスプローラーのような画面を作成してみた

2018年1月30日C#,開発

おはようございます。

今回はC#のWindowsFormsで、
エクスプローラーのようなUIを実装したいと思います。

WindowsFormsはまだブログに書いていないので、新規でプロジェクトを作成してください。

スポンサーリンク

画面の作成

コントロールの配置

左側にフォルダのTreeView、右側に選択されたツリー項目に格納されているフォルダ・ファイル一覧を表示するための ListView を配置します。

プログラムの実装

ファイルサイズ変換処理

ファイルサイズ(バイト)を単位付きに変換するメソッド

            /// <summary>
            /// ファイルサイズを単位付きに変換して返します.
            /// </summary>
            /// <param name="fileSize"></param>
            /// <returns></returns>
            private String getFileSize(long fileSize)
            {
                String ret = fileSize + " バイト";
                if (fileSize > (1024f * 1024f * 1024f))
                {
                    ret = Math.Round((fileSize / 1024f / 1024f / 1024f), 2).ToString() + " GB";
                }
                else if (fileSize > (1024f * 1024f))
                {
                    ret = Math.Round((fileSize / 1024f / 1024f), 2).ToString() + " MB";
                }
                else if (fileSize > 1024f)
                {
                    ret = Math.Round((fileSize / 1024f)).ToString() + " KB";
                }
    
                return ret;
            }

リストビュー項目設定処理

TreeView が選択された際に、格納されている項目の内容を ListView に設定するメソッド

            /// <summary>
            /// リストビューの項目を設定します.
            /// </summary>
            private void setListItem(String filePath)
            {
                // リストビューのヘッダーを設定
                listView1.View = View.Details;
                listView1.Clear();
                listView1.Columns.Add("名前");
                listView1.Columns.Add("更新日時");
                listView1.Columns.Add("サイズ");
    
                try
                {
                    // フォルダ一覧
                    DirectoryInfo dirList = new DirectoryInfo(filePath);
                    foreach (DirectoryInfo di in dirList.GetDirectories())
                    {
                        ListViewItem item = new ListViewItem(di.Name);
                        item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", di.LastAccessTime));
                        item.SubItems.Add("");
                        listView1.Items.Add(item);
                    }
    
                    // ファイル一覧
                    List<String> files = Directory.GetFiles(filePath).ToList<String>();
                    foreach (String file in files)
                    {
                        FileInfo info = new FileInfo(file);
                        ListViewItem item = new ListViewItem(info.Name);
                        item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", info.LastAccessTime));
                        item.SubItems.Add(getFileSize(info.Length));
                        listView1.Items.Add(item);
                    }
                }
                catch (IOException ie)
                {
                    MessageBox.Show(ie.Message, "選択エラー");
                }
    
                // 列幅を自動調整
                listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
            }

起動時の処理

画面表示時に TreeView と、デフォルトで選択されるフォルダ(ドライブ)の内容を ListViewに設定します。

            /// <summary>
            /// 起動時の処理
            /// </summary>
            public Form1()
            {
                InitializeComponent();
    
                // ドライブ一覧を走査してツリーに追加
                foreach (String drive in Environment.GetLogicalDrives())
                {
                    // 新規ノード作成
                    // プラスボタンを表示するため空のノードを追加しておく
                    TreeNode node = new TreeNode(drive);
                    node.Nodes.Add(new TreeNode());
                    treeView1.Nodes.Add(node);
                }
                // 初期選択ドライブの内容を表示
                setListItem(Environment.GetLogicalDrives().First());
            }

TreeView展開時の処理

展開された項目の子ノードを追加する処理を実装

            /// <summary>
            /// ツリービュー項目展開時(前)のイベントハンドラ.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
            {
                TreeNode node = e.Node;
                String path = node.FullPath;
                node.Nodes.Clear();
    
                try
                {
                    DirectoryInfo dirList = new DirectoryInfo(path);
                    foreach (DirectoryInfo di in dirList.GetDirectories())
                    {
                        TreeNode child = new TreeNode(di.Name);
                        child.Nodes.Add(new TreeNode());
                        node.Nodes.Add(child);
                    }
                }
                catch (IOException ie)
                {
                    MessageBox.Show(ie.Message, "選択エラー");
                }
    
            }

TreeView項目選択時の処理

選択された項目に格納されているファイル・フォルダ一覧を表示

            /// <summary>
            /// ツリービュー項目選択時(前)のイベントハンドラ.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                setListItem(e.Node.FullPath);
            }

起動してみる

起動後の画面

左側、TreeViewにドライブ、フォルダの一覧、右側に選択されたフォルダの内容を表示することができました。

まとめ

エクスプローラーのようなコントローラーであれば標準であっても良さそうなもんですけどね。

とりあえずしばらくは WindowsForm をやっていく予定です。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2018年1月30日C#,開発C#,WindowsForms,サンプルプログラム

Posted by doradora