【C#】TreeView と ListView でエクスプローラーのような画面を作成してみた
おはようございます。
今回は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 をやっていく予定です。
ではでは。
ディスカッション
コメント一覧
はじめまして。
こちらの階層表示をAzureを用いてBLOB内のフォルダ等を表示させることは可能でしょうか?
同じようにTreeViewにStrageAccountの表示、BLOB、コンテナーの一覧、Listboxに選択したコンテナー内のファイルを表示させたいのですが
名無し様
いつもブログを観ていただきありがとうございます。
ご質問の件ですが、「Azure Strage の BLOB に格納しているファイルなどの一覧を、WindowsFormsで作成したクライアントアプリで TreeView 表示、参照したい」ということでよろしいでしょうか?
申し訳ありません、私自身 Azure には詳しくないので確かなことは分かりません。
調べてみたところ「WindowsAzure.Storage」や「Azure.Storage」パッケージを利用すればできるのではないかと思います。
(ただし Account の一覧取得は難しいかもしれません)
下記、参考URLです。
https://docs.microsoft.com/ja-jp/dotnet/api/overview/azure/storage?view=azure-dotnet
https://qiita.com/kingkinoko/items/37694c71dbf036ccc157
お役に立てず申し訳ありません。。
doradoraさんのサイトを参考にC#の勉強をさせていただいています.
そのままコピペしてプログラムを実行したのですが
listview にドライブ以下のノードが作成されません.
原因がわかりますか?
いつもブログを見ていただきありがとうございます。
ご質問の件、
もしかしたら TreeView をクリックした際のイベントを登録されていないのでないでしょうか。
そうであれば、
デザインビューを開き、左側の TreeView を選択、
プロパティのイベント設定からクリックイベントの設定を追加し、
ソースに追加されたイベントメソッドに「TreeView項目選択時の処理」のように「setListItem」関数の呼び出しを入れてあげてください。
よろしくお願いします。