【C#】TreeView と ListView でエクスプローラーみたいな操作をする
おはようございます。
少し前後しましたが、エクスプローラ風画面作成の続きです。
今回は、リストビューに表示されたディレクトリをダブルクリックで下層に移動し、
「上へ」ボタンで上層に移動するサンプルとなります。
プログラムは前回のものを流用します。
スポンサーリンク
目次
画面の修正

1つ上のディレクトリに移動するためのボタンを追加します。
プログラム修正
ツリービューの指定した項目を選択状態にする処理を追加
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |         /// <summary>         /// ツリービューの指定されたディレクトリパスの項目を選択状態にします.         /// </summary>         /// <param name="dirPath"></param>         privatevoidselectTreeViewItem(TreeView trv,stringdirPath)         {             // ツリービューのノードを走査             foreach(TreeNode node intrv.Nodes)             {                 // 再帰処理で対象のディレクトリを処理                 selectTreeViewItem(node,dirPath);             }         }         /// <summary>         /// ツリービューの指定されたディレクトリパスの項目を選択状態にします(再帰処理用).         /// </summary>         /// <param name="node"></param>         /// <param name="dirPath"></param>         privatevoidselectTreeViewItem(TreeNode node,stringdirPath)         {             foreach(TreeNodeninnode.Nodes)             {                 FileInfo fi=newFileInfo(n.FullPath);                 // リストビューで表示されたディレクトリ名と一致する場合                 if(dirPath==fi.FullName)                 {                     // 選択状態にする                     treeView1.Focus();                     treeView1.SelectedNode=n;                     break;                 }                 selectTreeViewItem(n,dirPath);             }         } | 
ファイル一覧ダブルクリック時のイベントを追加
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |         /// <summary>         /// リストビューダブルクリックイベント.         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         privatevoidlistView1_MouseDoubleClick(objectsender,MouseEventArgse)         {             // 選択されたファイル情報を取得             ListViewItem selectedListItem=listView1.SelectedItems[0];             FileInfo fi=newFileInfo(selectedListItem.Name);             // ディレクトリであればファイル一覧の内容を更新する             if(fi.Attributes==FileAttributes.Directory)             {                 // ツリービュー上で対象のディレクトリ(ノード)が                 // 表示されている場合は選択状態にする                 selectTreeViewItem(treeView1,fi.FullName);                 // ファイル一覧の内容を更新                 setListItem(fi.FullName);                 selectedItem=fi.FullName;             }         } | 
追加した「上へ」ボタンの処理を追加
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |         /// <summary>         /// 上へボタンクリックイベント.         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         privatevoidbtnUp_Click(objectsender,EventArgse)         {             DirectoryInfo di=newDirectoryInfo(selectedItem);             if(di.Parent!=null)             {                 selectedItem=di.Parent.FullName;                 setListItem(di.Parent.FullName);                 // 表示されている場合は選択状態にする                 selectTreeViewItem(treeView1,selectedItem);             }         } | 
起動してみる


無事に操作できるようになりました。
まとめ
ひとまずエクスプローラーみたいな感じになってきました。
あとは検索とかもやってみるかもしれません。(予定)
ではでは。


 https://www.doraxdora.com/blog/2018/02/08/post-3866/
 https://www.doraxdora.com/blog/2018/02/08/post-3866/








ディスカッション
コメント一覧
大変見やすいプログラムで参考にさせてもらっていますが、「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 様
いつもブログを見ていただきありがとうございます。
ご質問の件、申し訳ありませんが、
調べるのに少しお時間をいただいてもよろしいでしょうか。
よろしくお願い致します。