Windows Management Instrumentation - инфраструктура управления операционной системой, страница 12

¨  Заново заполнить узлы дерева (только те, которые необходимо) с учетом необходимости показать или скрыть специальные папки,

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

¨  Разрешить перерисовку дерева.

Вновь перейдите к проекту Library и разработайте алгоритм обновления дерева с учетом флага bHidden.

public void RefreshTree ()

{

  UpdateStatusBar (Color.WhiteSmoke, "Refreshing Tree Information...");

  Cursor = Cursors.WaitCursor;   tree.BeginUpdate();

  ClearTags (root);  // Очищаем все флаги заполненных узлов

  TreeNode sel = // Запомните выбранный узел

  foreach (По всем узлам, вложенным в корневой узел дерева)

  {

     expandedNodes.Clear();  // Коллекция узлов, расположенных внутри текущего и раскрытых сейчас

     GetExpanded (node);  // Заполнение коллекции раскрытых узлов

     //==== Очистите коллекцию узлов, вложенных в текущий узел

     AddItems(node);    // Заново вставляем все узлы

     if (expandedNodes.Count > 0)// Если не пуста коллекция раскрытых узлов

       RestoreExpanded (node); // Восстанавливаем коллекцию раскрытых узлов

  }

  tree.SelectedNode = sel;  // Восстанавливаем выбранный узел

  tree.EndUpdate();    Cursor = Cursors.Default;

  UpdateStatusBar (Color.WhiteSmoke, "Ready");

}

Первый пункт перечня заданий достаточно прост. Далее, надо запомнить текущее состояние дерева, так как мы собираемся заполнить его заново. Для того, чтобы те узлы дерева, которые помечены тэгами, как заполненные, обновились, надо очистить теэги (свойства Tag) абсолютно всех узлов. Для этого мы вызываем функцию ClearTags. Вы догадываетесь, что она должна быть рекурсивной. Рассмотрим ее заготовку.

private void ClearTags (TreeNode node)

{

  foreach (По всем узлам n, вложенным в текущий узел node)

  {

     if (его Tag не нулевой)

     {

       // Обнулите его

       // Автовызов для обнуления Tag всех вложенных узлов

     }

  }

}

Далее, рассмотрим, как заполнить список (коллекцию типа SortedList) тех узлов, которые вложены в данный и раскрыты в данный момент. Эта функцию тоже удобно сделать рекурсивной.

private void GetExpanded (TreeNode node)

{

  if (Узел node раскрыт)

  {

     // Вставьте строку с его полным путем в коллекцию

     foreach (По всем узлам n, вложенным в текущий узел node)

       // Автовызов

  }

}

Теперь необходимо разработать процедуру реставрации дерева. В течение этой процедуры вновь заполняются только те ветви, которые необходимы для того, чтобы показать дерево в том же состоянии, в каком оно было до поступления команды о реставрации. При этом мы, конечно вызовем метод AddSubItems, который в свою очередь вызывает AddItems (именно он учитывает изменившееся состояние флага bHide). При повторном раскрытии дерева мы должны видеть системные и скрытые папки, которые ранее были не видны. Важно, чтобы этот процесс прошел плавно без лишних перерисовок.

private void RestoreExpanded (TreeNode node)

{

  if (Коллекция вложенных узлов пуста)

     return;

  if (Коллекция expandedNodes содержит текущий узел)

  {

     AddSubItems (node);  // Заново заполним вложенные узлы

     node.Expand();   // Восстанавливаем раскрытое состояние

     foreach (По всем узлам n, вложенным в текущий узел node)

       // Автовызов

  }

}

При запуске приложения и использовании кнопки bHidden вы должны видеть скрытые папки, например: System Volume Information, RECYCLER, installer и другие. Совсем несложно сопоставить этим папкам специальные изображения, чтобы можно было отличить их по виду. Это пока не сделано.

Разработка второго компонента

Приступим к разработке второго компонента библиотеки Library, который должен с помощью класса WMI получить общую информацию о системе и показать ее в окне, связанном со страницей pageSysInfo блока страниц TabControl. Общий вид компонента показан на рисунке ниже.

1.  В окне Solution Explorer выделите имя проекта Library и в его контекстном меню выберите команду Add4Add New Item.

2.  В диалоге Add New Item выберите тип проекта User Control, задайте имя SysInfoControl.cs и нажмите кнопку Open.

3.  Переведите текущий файл (класс SysInfoControl) в режим дизайна и задайте размеры его окна равными примерно (776; 416).

4.  В окне Toolbox возьмите элемент типа ImageList и положите его на форму. Задайте ему имя (свойство Name) treeImages.

5.  Положите на форму элемент типа TreeView. Задайте ему следующие свойства: Name = tree, Dock = Left, Size = 600; 416, ImageList = treeImages.

6.  Положите элемент типа Splitter. Cвойства: Name = splitter, Location = 600; 0, Dock = Left.

7.  Элемент типа Button. Cвойства: Name = bRefresh, Text = Refresh, FlatStyle = Flat, Location = 648; 24.

8.  Элемент типа GroupBox. Cвойства: Name = grMachine, Text = Machine, Location = 636; 64.

9.  Положите два элемента типа RadioButton. Cвойства: Name = rdCurrent и rdRemote, Text = Current и Remote, Checked = True и False, TabStop = True и False, Location = (20; 20) и (20; 44).

10.  Три элемента типа Label. Cвойства: Name = label1, label2 и label3, Text = IP or Machine Name, UserID: и Password:, AutoSize = True, Location = (632; 172), (632; 232) и (632; 292), Size = 57; 16, Visible = False.

11.  Три элемента типа TextBox. Cвойства: Name = textName, textUserID и textPass, Text = пусто Location = (628; 196), (628; 252) и (628; 312) Size = 116; 20, Visible = False.

12.  Введите обработку события. При активном элементе radioCurrent нажмите кнопку Events, найдите событие CheckedChanged и совершите по этой строке двойной щелчок.

13.  Совершите двойной щелчок по кнопке bRefresh для того, чтобы студия ввела обработчик ее нажатия.

14.  В окне Solution Explorer выделите узел Library и в его контекстном меню выберите команду Rebuild.

Пока вы не забыли про обработчик уведомляющего события CheckedChanged введите его коды. Логика такова: видимость 3-х последних меток (Label) и окон редактирования должна зависеть от состояния переключателя Current-Remote. Если он в состоянии Remote, то нам следует предоставить пользователю возможность ввести: IP-адрес (или имя) удаленной машины, идентификатор пользователя и его пароль. Без этих данных мы не сможем (с помощью классов WMI) получить информацию об удаленной машине.