ListView (С# WinForms). Переход по каталогам. Реализация подобия проводника
Есть такая задача:
Создать приложение аналог Проводника. В приложении, в отличии от проводника, есть только ListView. При старте отображается содержимое диска С: Есть возможность: открывать файлы, переходить в подпапки (при двойном клике). Реализовать разные способы отображения ListView. Файлы и папки должны иметь разные иконки.
Часть сделал, папки и файлы диска С отображаются, но дальше уперся в то, что не знаю, как реализовать переход по каталогам дальше. Пробовал по разному, и объект пересоздавать и сохранять отдельно полное имя каталога...не выходит, зачастую выдает исключение, что не правильный указан путь, или вообще не работает. Пробовал читать и про DirectoryInfo и про FileSystemInfo и мало что понял...Буду благодарен, если подскажите, как реализовать переход...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Lesson6_ListView_HomeWork_Koval
{
public partial class Form1 : Form
{
DirectoryInfo di = new DirectoryInfo(@"c:\");
bool flag = true;
public Form1()
{
InitializeComponent();
listView1.MouseWheel += ListView1_MouseWheel;
listView1.LargeImageList = new ImageList();
listView1.SmallImageList = new ImageList();
listView1.LargeImageList.Images.Add("folder", Image.FromFile(@"Image\Papka.jfif"));
listView1.LargeImageList.Images.Add("file", Image.FromFile(@"Image\File.jfif"));
listView1.LargeImageList.ImageSize = new Size(64, 64);
listView1.SmallImageList.Images.Add("folder", Image.FromFile(@"Image\Papka.jfif"));
listView1.SmallImageList.Images.Add("file", Image.FromFile(@"Image\File.jfif"));
listView1.SmallImageList.ImageSize = new Size(32, 32);
View[] views = Enum.GetValues(typeof(View)) as View[];
foreach (View view in views)
{
var menuItem = ViewToolStripMenuItem.DropDownItems.Add($"{view}");
menuItem.Click += MenuItem_Click;
}
listView1.FullRowSelect = true;
listView1.GridLines = true;
listView1.Columns.Add("Имя");
listView1.Columns.Add("Тип");
listView1.Columns.Add("Дата создания");
foreach (FileSystemInfo fsi in di.GetFileSystemInfos())
{
if (Directory.Exists(fsi.FullName))
{
var item = listView1.Items.Add(fsi.Name, "folder");
item.SubItems.Add("[DIR]");
item.SubItems.Add(fsi.CreationTime.ToString());
}
else
{
var item = listView1.Items.Add(fsi.Name, "file");
item.SubItems.Add(fsi.Extension);
item.SubItems.Add(fsi.CreationTime.ToString());
}
}
ViewToolStripMenuItem.Click += ToolStripMenuItem3_Click;
listView1.FullRowSelect = true; // выделение строки в детализированном виде
listView1.ItemSelectionChanged += ListView1_ItemSelectionChanged; // событие выбора элемента
listView1.GridLines = true; // отображение сетки
}
private void ListView1_MouseWheel(object sender, MouseEventArgs e)
{
var oldSize = listView1.LargeImageList.ImageSize;
listView1.LargeImageList.ImageSize = new Size(oldSize.Width + 8, oldSize.Height + 8);
}
private void ListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
listView1.Items.Clear();
toolStripLabel1.Text = e.Item.Text;
View[] views = Enum.GetValues(typeof(View)) as View[];
foreach (View view in views)
{
var menuItem = ViewToolStripMenuItem.DropDownItems.Add($"{view}");
menuItem.Click += MenuItem_Click;
}
foreach (FileSystemInfo fsi in di.GetFileSystemInfos())
{
if (Directory.Exists(fsi.FullName))
{
// MessageBox.Show(fsi.FullName);
var item = listView1.Items.Add(fsi.Name, "folder");
item.SubItems.Add("[DIR]");
item.SubItems.Add(fsi.CreationTime.ToString());
}
else
{
// MessageBox.Show(fsi.FullName);
var item = listView1.Items.Add(fsi.Name, "file");
item.SubItems.Add(fsi.Extension);
item.SubItems.Add(fsi.CreationTime.ToString());
}
}
}
}
private void MenuItem_Click(object sender, EventArgs e)
{
ToolStripItem item = sender as ToolStripItem;
listView1.View = (View)Enum.Parse(typeof(View), item.Text); ;
}
private void ToolStripMenuItem3_Click(object sender, EventArgs e)
{
listView1.View = View.Details;
}
private void ViewToolStripMenuItem_Click(object sender, EventArgs e)
{
}
}
}