На собеседовании дали небольшое задание. Смысл заключался в написании маленького файлового обозревателя с обязательной ленивой подгрузкой информации о файлах и папках. Всё это должно быть написано на C# и использовать элемент TreeView (WPF).
Как всё должно работать? Создаём дерево, вешаем событие развёртывания узла, добавляем подгрузку информации на текущем каталоге. Далее по порядку.
Итак, первым делом заходим в конструктор, вытягиваем элемент TreeView из панели инструментов, задаём имя treeView и параметр Loaded. Должна получиться вот такая строка, расположение элемента значения не имеет
<TreeView Name ="treeView" Loaded="TreeView_Loaded" />
Переходим к коду. Для работы с дисками нужно добавить строчку
using System.IO;
Теперь создадим функцию создания дерева томов. Она должна иметь тип TreeViewItem и имя TreeView_CreateTree. Далее добавляем корень к дереву с произвольным названием (My computer, например), заполняем узлами с именами дисков, устанавливаем состояние развёртывания.
TreeViewItem TreeView_CreateTree() { TreeViewItem Mycomputer = new TreeViewItem { Header = "My computer", IsExpanded = false }; foreach (var drive in DriveInfo.GetDrives()) { TreeViewItem treeDrive = new TreeViewItem(); try { treeDrive.Header = String.Format("{0} ({1}:)", drive.VolumeLabel, drive.Name[0]); treeDrive.Items.Add(null); } catch { } treeDrive.Tag = drive.Name; treeDrive.Expanded += TreeViewItem_Expanded; Mycomputer.Items.Add(treeDrive); } return Mycomputer; }Для обеспечения ленивости добавим загрузку информации в событие развёртывания узла.
void TreeViewItem_Expanded(object sender, RoutedEventArgs e) { TreeViewItem rootItem = (TreeViewItem)sender; if(rootItem.Items.Count == 1 && rootItem.Items[0] == null) { rootItem.Items.Clear(); //массивы для последующего вывода файлов и папок string[] dirs; string[] files; dirs = Directory.GetDirectories((string)rootItem.Tag); //получаем все папки и файлы на текущем узле files = Directory.GetFiles((string)rootItem.Tag); foreach (var dir in dirs) //заполнение дерева папками { TreeViewItem subItem = new TreeViewItem(); subItem.Header = new DirectoryInfo(dir).Name; subItem.Tag = dir; subItem.Items.Add(null); subItem.Expanded += TreeViewItem_Expanded; rootItem.Items.Add(subItem); } foreach (var fils in files) //заполнение дерева файлами { TreeViewItem subItem = new TreeViewItem(); subItem.Header = new DirectoryInfo(fils).Name; subItem.Tag = fils; try { if (Directory.GetFiles(fils).Length > 0) subItem.Items.Add(null); } catch { } subItem.Expanded += TreeViewItem_Expanded; rootItem.Items.Add(subItem); } }
Теперь, чтоб это всё работало, добавим функцию, которая будет работать при загрузке элемента treeview и вызывать функцию заполнения узлов именами дисков
catch { }
ОтветитьУдалитьНу нельзя же так. Хоть логируй ошибку
стиль написания неочень)
ОтветитьУдалить