BETA

【C#】TreeView と ListView でエクスプローラーのような表示をする

投稿日:2019-07-26
最終更新:2019-07-31

おはようございます。

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

新規でプロジェクトを作成してください。

画面の作成

左側にフォルダの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 HHss}", 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 HHss}", 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 をやっていく予定です。

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう