おはようございます。
今回は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);
}
```
## 起動してみる

左側、TreeViewにドライブ、フォルダの一覧、右側に選択されたフォルダの内容を表示することができました。
## まとめ
エクスプローラーのようなコントローラーであれば標準であっても良さそうなもんですけどね。
とりあえずしばらくは WindowsForm をやっていく予定です。
ではでは。
コメント