【C#】TreeView と ListView でエクスプローラーみたいな操作をする
おはようございます。
少し前後しましたが、エクスプローラ風画面作成の続きです。
今回は、リストビューに表示されたディレクトリをダブルクリックで下層に移動し、
「上へ」ボタンで上層に移動するサンプルとなります。
プログラムは前回のものを流用します。
スポンサーリンク
目次
画面の修正
1つ上のディレクトリに移動するためのボタンを追加します。
プログラム修正
ツリービューの指定した項目を選択状態にする処理を追加
/// <summary>
/// ツリービューの指定されたディレクトリパスの項目を選択状態にします.
/// </summary>
/// <param name="dirPath"></param>
private void selectTreeViewItem(TreeView trv, string dirPath)
{
// ツリービューのノードを走査
foreach (TreeNode node in trv.Nodes)
{
// 再帰処理で対象のディレクトリを処理
selectTreeViewItem(node, dirPath);
}
}
/// <summary>
/// ツリービューの指定されたディレクトリパスの項目を選択状態にします(再帰処理用).
/// </summary>
/// <param name="node"></param>
/// <param name="dirPath"></param>
private void selectTreeViewItem(TreeNode node, string dirPath)
{
foreach (TreeNode n in node.Nodes)
{
FileInfo fi = new FileInfo(n.FullPath);
// リストビューで表示されたディレクトリ名と一致する場合
if (dirPath == fi.FullName)
{
// 選択状態にする
treeView1.Focus();
treeView1.SelectedNode = n;
break;
}
selectTreeViewItem(n, dirPath);
}
}
ファイル一覧ダブルクリック時のイベントを追加
/// <summary>
/// リストビューダブルクリックイベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
// 選択されたファイル情報を取得
ListViewItem selectedListItem = listView1.SelectedItems[0];
FileInfo fi = new FileInfo(selectedListItem.Name);
// ディレクトリであればファイル一覧の内容を更新する
if (fi.Attributes == FileAttributes.Directory)
{
// ツリービュー上で対象のディレクトリ(ノード)が
// 表示されている場合は選択状態にする
selectTreeViewItem(treeView1, fi.FullName);
// ファイル一覧の内容を更新
setListItem(fi.FullName);
selectedItem = fi.FullName;
}
}
追加した「上へ」ボタンの処理を追加
/// <summary>
/// 上へボタンクリックイベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUp_Click(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(selectedItem);
if (di.Parent != null)
{
selectedItem = di.Parent.FullName;
setListItem(di.Parent.FullName);
// 表示されている場合は選択状態にする
selectTreeViewItem(treeView1, selectedItem);
}
}
起動してみる
無事に操作できるようになりました。
まとめ
ひとまずエクスプローラーみたいな感じになってきました。
あとは検索とかもやってみるかもしれません。(予定)
ではでは。
ディスカッション
コメント一覧
大変見やすいプログラムで参考にさせてもらっていますが、「selectedItem」のところで、「現在のコンテキスト内に存在しません」と表示されてしまいます。
何か足りないのだと思いますが、初心者なので原因を見つけることができませんでした。
もし、お分かりでしたら教えていただけるとありがたいです。
// ファイル一覧の内容を更新
setListItem(fi.FullName);
selectedItem = fi.FullName; ←ここなど
よろしくお願いします。
selectedListItem.Nameのところで、「パスの形式が無効です」と表示されてしまいます。
いろいろ調べてみましたが、ここに選択しているファイル名は入っているようですが、
絶対パスで指定していないためエラーになっているような気がしています。
しかし、selectedListItem.Nameにはファイル名しか入っていないので、絶対パスに変換
する方法が分かりません。
よろしくお願いします。
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
// 選択されたファイル情報を取得
ListViewItem selectedListItem = listView1.SelectedItems[0];
FileInfo fi = new FileInfo(selectedListItem.Name); ←ここ
norio 様
いつもブログを見ていただきありがとうございます。
ご質問の件、申し訳ありませんが、
調べるのに少しお時間をいただいてもよろしいでしょうか。
よろしくお願い致します。