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

¨  С помощью классов WMI (ManagementObjectSearcher и ManagementObject),

¨  С помощью класса Environment (самый простой, но медленный способ),

¨  С помощью класса Directory (простой, но медленный способ).

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

¨  Для определения индексов изображений узлов дерева мы уже ввели вспомогательный метод GetImageID.

¨  Наполнять дерево узлами будем в методе FillTree. Вставьте код, который наполняет дерево всеми доступными дисками.

void FillTree()

{

root = // Создайте корневой узел My Computer

ManagementObjectSearcher searcher = new ManagementObjectSearcher(

@"\\localhost\root\CIMV2", "SELECT DeviceId, DriveType From Win32_LogicalDisk");

TreeNodeCollection nodes = root.Nodes;

foreach (Для каждого объекта drive из коллекции searcher)

{

string

name = drive["DeviceId"].ToString(),

type = drive["DriveType"].ToString();

AddWatcher(type, name);

int id = GetImageID(type, name);

nodes.Add(new TreeNode(name, id, id + 1));

}

tree.BeginUpdate();

tree.Nodes.Add(root);

tree.EndUpdate();

root.Expand();

}

Уведомления, или события, генерируемые программным способом

Добавьте в класс FileSystemControl вспомогательный метод SetMessage, который возбуждает уведомляющее событие и передает ему текст уведомления. Цель метода — генерировать событие UpdateLog для того, чтобы клиентское приложение могло отреагировать на него и вывести в журнал событий посылаемое нами сообщение.

void SetMessage(string s)

{

if (UpdateLog != null)

UpdateLog(s);

}

Метод SetMessage посылает уведомления всем объектам, подписавшимся на их получение. Сейчас мы подпишем форму главного окна и она будет получать уведомление всякий раз, когда сработает событие UpdateLog. При этом текст уведомления будет отображаться в элементе logList. Список logList был добавлен в форму ранее.

Событие UpdateLog объявлено в блоке переменных класса FileSystemControl. Вспомните, что каждому событию должен соответствовать какой-то делегатный тип, причем тип события должен быть идентичен типу его делегатов. Убедитесь, что событие соответствует существующему в системе делегатному типу Action<string>.

Для того, чтобы уведомления заработали, надо:

¨  Добиться безошибочного построения DLL (проекта по имени Library),

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

¨  Найти свойство UpdateLog, которое расположено в блоке Misc и совершить над ним двойной щелчок. Категория Misc и свойство UpdateLog появятся в дизайнере лишь в случае успеха в построении компонента FileSystemControl.

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

Напомню, что делегата и его задание (обработчик события) легко добавить и вручную. Например, так:

fileSystem.UpdateLog += new UpdateHandler(fileSystem_UpdateLog);

Важно, чтобы объявление делегата было единственным. Иначе событие UpdateLog будет обработано многократно. Теперь вставьте в обработчик события тривиальный код, который отображает сообщение в элементе logList.

void fileSystem_UpdateLog(string msg)

{

logList.Items.Add(msg);

logList.SelectedIndex = logList.Items.Count - 1;

}