Windows Management Instrumentation. События в WMI. Библиотека классов MyWMI. Особенности работы с большим деревом, страница 12

¨  Обратиться к проекту Client, открыть MainForm.cs в режиме дизайна, выделить на форме разрабатываемый нами компонент, в окне свойств нажать кнопку Events,

¨  Найти свойство UpdateStatus, которое расположено в блоке Misc и совершить над ним двойной щелчок.

Категория Misc и свойство UpdateStatus появятся в дизайнере лишь в случае успеха в построении компонента ExplorerControl. Далее, вставьте в обработчик события тривиальный код, который отображает сообщение в статус строке.

private void explorer_UpdateStatus (Color clr, string msg)

{

  if (info.BackColor != clr)

    info.BackColor = clr;

  info.Text += msg + "\r\n";

  info.Select (info.Text.Length, 0);

  info.ScrollToCaret();

}

Если вы захотите увидеть делегата, которого создал дизайнер в момент совершения двойного щелчка, то вы найдете его внутри скрытого кода (метода InitializeComponents). Код выглядит следующим образом.

this.explorer.UpdateStatus += new Library.ExplorerControl.StatusHandler(

  this.explorer_UpdateStatus);

Отныне все сообщения, приносимые делегатом события UpdateStatus, будут безотказно отображаться в строке состояния. Мы будем пользоваться этим и при создании других компонентов. Полезно назвать по именам всех участников процесса доставки сообщения (событие, делегат и функция отклика). Найдите все эти объекты в качестве упражнения. Замечание: на рисунке ниже эта функциональность пока отсутствует.

Если с картинками и кодом вы справились, то запустив приложение, должны увидеть дерево, в котором присутствуют только диски. При выборе узла его изображение должно изменяться.

Узлы дерева (кроме корневого) не имеют маркеров раскрытия, так как мы заполнили только один уровень вложенности. Теперь надо создать метод (назовем его AddItems), который опрашивает все папки, вложенные внутрь текущей и генерирует узлы дерева, опираясь на эту информацию.

Каждому узлу дерева соответствует файловый путь и в данный момент он нам понадобится. Если ориентироваться только на один уровень вложенности, то получить эту информацию просто, но если вспомнить о произвольном уровне вложенности, то придется создать вспомогательный метод, который вычисляет полный путь. Здесь удобно и достаточно эффективно использовать рекурсию. Цепь рекурсивных вызовов позволяет подняться по дереву, начиная от текущего узла и заканчивая узлом, который находится в корне всего дерева. Таким образом находится файловый путь. Ниже приводится это решение в виде метода GetPath.

private string GetPath (TreeNode node)

{

return node.Parent==root ? node.Text + '\\' :

    Path.Combine (GetPath (node.Parent), node.Text);

}

Как видите, метод GetPath вызывает сам себя до тех пор, пока не доберется до корня дерева. Сам корень ("My Computer") нам не нужен, так как он портит стандартный файловый путь. Он введен только из уважения к традиции Microsoft использовать виртуальные папки типа: MyDocuments, MyMusic, History, Cookies и т. д.

Класс Path специально создан для работы со строками текста, которые представляют собой файловые пути. Он имеет ряд удобных методов, которыми мы будем пользоваться и далее. Используйте метод GetPath в алгоритме генерации узлов дерева и заполнения ими коллекции узлов, вложенных в текущий.

private void AddItems (TreeNode node)

{

      //==== Получите информацию о текущем узле node (используйте класс DirectoryInfo). Здесь понадобится полный файловый путь узла node

  if (информация не существует - Floppy or CD не вставлен (Используйте метод Exists класса DirectoryInfo))

    return;

  DirectoryInfo[] dirs; // Коллекции вложенных папок

  try {Получите информацию о коллекции вложенных папок} // Используем блок try-catch, так как доступ к некоторым папкам закрыт

  catch (UnauthorizedAccessException) { return; } // Игнорируем Security Exceptions

  catch (Exception e)  // Не игнорируем другие Exceptions

  {