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

Возможны и другие решения (его использовал Тихановский А.С.)—не уничтожать все узлы и не заполнять дерево заново, а аккуратно удалить или вставить только те узлы, которые нужно.

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

public void RefreshTree()

{

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

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

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

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

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

  {

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

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

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

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

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

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

  }

  if (Если существует узел дерева с именем selPath)

  {

    // Выберите его с тем. чтобы восстановить исходное состояние дерева

    RefreshList (searchNode); // Заново показываем файлы (возможно и скрытые до этого)

  }

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

}

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

private void ClearTags (TreeNode node)

{

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

  {

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

    {

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

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

    }

  }

}

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

private void GetExpanded (TreeNode node)

{

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

  {

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

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

      // Автовызов

  }

}

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

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.