Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 27

return new ListViewItem(new string[]

{

file.Name,

size,

file.CreationTime.ToShortDateString() + separator + file.CreationTime.ToShortTimeString(),

file.LastWriteTime.ToShortDateString() + separator + file.LastWriteTime.ToShortTimeString()

}, 0, clr, Color.White, fileList.Font);

}

return null;

}

ListView заполняется объектами типа ListViewItem, которые можно конструировать на основе массива текстовых строк. При работе с ListView надо усвоить особенности принятой для него терминологии. Понятию Item соответствует строка списка, а понятию SubItem — столбец (или колонка). Строки типа Item заполняются колонками, которые Microsoft по традиции называет SubItems. Такие странные имена объясняются тем, что ListView умеет работать не только в режиме таблицы (см. значение стиля View для элемента ListView—у нас оно равно Details), но и в режиме отображения множества картинок (см. значения стиля SmallIcon и LargeIcon).

В настоящий момент дерево папок файловой системы должно функционировать, как было задумано. Маркеры раскрытия должны присутствовать во всех непустых узлах. Непустыми считаются узлы, в которые вложены другие узлы. В корневой узел "My Computer" вложены только диски, а все остальные узлы могут быть либо пустыми, либо содержать папки. Файлы отображаются только в списке справа (в отличие от Windows Explorer).

Если вы успешно реализовали логику метода FillFolder, то при запуске приложения увидите картину, показанную на рисунке. Диски, не выбранные пользователем, не имеют маркеров раскрытия (+), а папки — да. Почему? Потому, что при создании узлов дерева, соответствующих дискам, мы не вызывали метод FillFolder. Это экономит память, так как пользователя обычно интересуют лишь некоторые диски.

При выборе диска или папки (события BeforeExpand или AfterSelect) заполнение дерева опережает выбор пользователя на два уровня. Вы можете управлять параметром depth (глубина выборки). Антон Тур ввел для этой цели специальный элемент управления типа TrackBar и связал его с переменной depth. Вы можете поступить так же и проанализировать поведение дерева при разных уровнях глубины выборки.

Сортировка строк в элементе ListView

В левой части окна компонента fileSystem изображено дерево папок, а в правом отображен список файлов, хранящихся в папке, которая в данный момент выбрана в дереве. Для того, чтобы список файлов, отображаемый в элементе ListView, можно было сортировать, нажимая на заголовки его столбцов, необходимо создать вспомогательный класс, реализующий интерфейс IComparer. Он нужен для того, чтобы гибко изменять функцию сравнения данных в зависимости от номера столбца списка.

Дело в том, что в столбцах расположены данные разных типов. В первом столбце отображены имена файлов, во втором — их размеры, в третьем — дата  создания файла, в четвертом — дата изменения. Данные в колонке Size имеют тип double, так как мы хотим отображать размер в giga-, mega-, kilo-байтах, а иногда и в байтах. Алгоритм сортировки должен учитывать различие в типах данных колонок. Режим сортировки (по возрастанию, или по убыванию), зависит от четности щелчка по данной колонке и это необходимо учесть при сравнении двух объектов.

Интерфейс IComparer определен в System.Collections. Он имеет всего один метод Compare, который должен вернуть (–1, 0, +1) в зависимости от результата сравнения двух объектов (знакомо, не правда ли?). Но мы добавим логику, которая вызвана особенностями форматирования данных. В состав класса FileSystemControl уже введена статическая переменная separator, которая повышает читабельность дат. С ее помощью мы отделим дату создания файла от времени, которое является частью переменной типа DateTime.

Введите в пространство имен Library (после класса FileSystemControl, но лучше в отдельном файле) код нового класса FileComparer. Он поможет разобраться в проблеме сортировки списка из четырех колонок.

namespace Library

{

class FileComparer : IComparer

{

public int col;

public SortOrder order;

public FileComparer() { col = 0; order = SortOrder.Ascending; }