2019-07-26に投稿

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

おはようございます。

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

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

画面の作成

コントロールの配置

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

プログラムの実装

ファイルサイズ変換処理

ファイルサイズ(バイト)を単位付きに変換するメソッド ``` /// /// ファイルサイズを単位付きに変換して返します. /// /// /// 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 に設定するメソッド ``` /// /// リストビューの項目を設定します. /// 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 files = Directory.GetFiles(filePath).ToList(); 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に設定します。 ``` /// /// 起動時の処理 /// 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展開時の処理 展開された項目の子ノードを追加する処理を実装 ``` /// /// ツリービュー項目展開時(前)のイベントハンドラ. /// /// /// 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項目選択時の処理 選択された項目に格納されているファイル・フォルダ一覧を表示 ``` /// /// ツリービュー項目選択時(前)のイベントハンドラ. /// /// /// private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { setListItem(e.Node.FullPath); } ``` ## 起動してみる ![起動後の画面](https://www.doraxdora.com/wp-content/uploads/2018/01/CSharpTreeView001.jpg) 左側、TreeViewにドライブ、フォルダの一覧、右側に選択されたフォルダの内容を表示することができました。 ## まとめ エクスプローラーのようなコントローラーであれば標準であっても良さそうなもんですけどね。 とりあえずしばらくは WindowsForm をやっていく予定です。 ではでは。  
Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント