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

Для того, чтобы заполнить дерево узлами, отражающими состояние объектов файловой системы, необходимо сначала правильно заполнить коллекцию (ImageList) из 12-ти картинок, о способе индексации которых мы договорились ранее. Я расчитываю, что с этой задачей вы уже справились, и можно начать заполнение с корневого узла "My Computer". Внутрь этого узла следует поместить множество узлов (т.е. объектов класса TreeNode), текст которых соответствует именам логических дисков, а иконки — их типам. Имена следует получить из перечня логических дисков. Перечень можно получить одним из трех способов. Используйте:

¨  классы WMI (ManagementObjectSearcher и ManagementObject),

¨  или класс Environment (самый простой и, поэтому рекомендуемый мною, способ),

¨  или класс Directory.

При навигации по дереву всегда важно знать, заполнен-ли данный узел вложенными сущностями, или нет. Для этой цели удобно использовать свойство Tag, которое имеется в каждом объекте — потомке класса Control. Свойство Tag определено как object и, поэтому способно управлять объектом произвольного типа. Смысл этой переменной присваивает программист. Мы используем Tag каждого объекта класса TreeNode как флаг, указывающий на то, что множество узлов, вложенных в данный узел, уже не пусто. Для определения индексов изображений узлов дерева целесообразно ввести вспомогательный метод.

public int GetImageID (string name)

{

  DiskTypes type = (DiskTypes)GetDriveType (name);

  return

    type == DiskTypes.LocalDisk ? 2 :   // Такой код компактней, чем switch

    type == DiskTypes.CDROM     ? 4 :

    type == DiskTypes.Removable ? 6 :

    type == DiskTypes.Network   ? 8 : 0;

}

Заполнять дерево будем в методе FillTree. Добавьте вызов этого метода в обработчик события Load, а в теле FillTree реализуйте алгоритм заполнения.

public void FillTree()

{

  UpdateStatusBar (Color.WhiteSmoke, "Refreshing Directory List...");

   //===== Тормозните перерисовку дерева (Напомним, что это объект tree. См. метод BeginUpdate)

      //===== Уничтожьте коллекцию узлов дерева

   //===== Создайте корневой узел "My Computer" (Используйте переменную root)

  //===== Установите в true  свойство Tag (для корневого узла root)

      //===== Вставьте в дерево корневой узел

      string[] drives = // Получите список логических дисков (Например, с помощью класса Environment)

foreach (string drive in drives)

  {

    string name = drive.Substring (0, drive.Length - 1); // Убираем разделитель

    int id = GetImageID (drive);

    //===== Создайте новый узел (используйте id)

    //===== Вставьте его в коллекцию узлов, вложенных в корневой узел

    AddItems (node); // Заполнение коллекции вложенных узлов. Этот метод предстоит разработать

  }

      //===== Разрешите перерисовку дерева

}

Здесь вызывается метод UpdateStatusBar. Его цель—генерировать событие UpdateStatus для того, чтобы клиентское приложение могло отреагировать и вывести в строку состояния главного окна посылаемое нами сообщение. Само событие UpdateStatus мы объявили ранее (см. общий блок переменных класса ExplorerControl). Вспомните, что каждому новому событию должен соответствовать какой-то делегатный тип, причем тип события должен быть идентичен типу его делегатов. Убедитесь, что в классе уже объявлен делегатный тип StatusHandler:

public delegate void StatusHandler (Color clr, string msg);

и ему соответствует событие, имеющее тот же тип:

public event StatusHandler UpdateStatus;

Теперь вставьте в класс ExplorerControl вспомогательный метод, который возбуждает событие и передает ему цвет и текстовую строку, которая должна отобразиться в строке info главного окна.

private void UpdateStatusBar (Color clr, string s)

{

  if (UpdateStatus != null)

    UpdateStatus (clr, s);

}

Для того, чтобы это заработало, надо:

¨  Создать DLL (добиться безошибочного ее построения),