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

Во время навигации по дереву классов пользователь видит имена классов и, обнаружив интересующий его класс, выбирает его. Нам следует обработать событие выбора узла дерева классов и в коде его обработки заполнить данными три списка: listProp, listMethods и listQualifiers. Логику опроса классов на предмет выявления его свойств, методов и описателей мы уже рассматривали, поэтому приведем лишь код ее реализации.

void treeClasses_AfterSelect(object sender, TreeViewEventArgs e)

{

if (e.Node == treeClasses.Nodes[0] || treeNS.SelectedNode == null)

return;

ClearLists();

nsName = treeNS.SelectedNode.FullPath;

clsName = treeClasses.SelectedNode.Text;

lblMethods.Text = clsName;

try

{

curClass = new ManagementClass(nsName, clsName, null);

ObjectGetOptions op = new ObjectGetOptions(null, TimeSpan.MaxValue, true);

curClass.Options.UseAmendedQualifiers = true;

foreach (MethodData m in curClass.Methods)

{

listMethods.Items.Add(m.Name);

nMethods++;

}

foreach (PropertyData p in curClass.Properties)

{

listProp.Items.Add(p.Name);

nProps++;

}

foreach (QualifierData q in curClass.Qualifiers)

{

if (q.Name.Equals("Description"))

tDescrClasses.Text = q.Value.ToString();

listQualifiers.Items.Add(q.Name);

nQualifiers++;

}

lblNumProp.Text = nProps + " properties";

lblNumMethods.Text = nMethods + " methods";

lblNumQualifiers.Text = nQualifiers + " qualifiers";

}

catch (ManagementException){}

}

При выборе строки в дереве классов обновляются все три списка: свойств, методов и описателей. Теперь пользователь может выбрать строку в одном из этих списков. При выборе строки в списке свойств пользователь должен увидеть его описание, если оно существует в соответствующем объекте ManagementClass. Следующий код обрабатывает событие выбора (SelectedIndexChanged) в списке свойств, генерирует описание и помещает его в текстовое поле tDescr. Главную роль здесь играет метод GetPropertyQualifierValue, вызванный для объекта ManagementClass.

void listProp_SelectedIndexChanged(object sender, EventArgs e)

{

if (curClass == null)

return;

btnGetValues.Visible = true;

try

{

lblDescr.Text = "Property: " + listProp.Text;

foreach (PropertyData p in curClass.Properties)

{

if (p.Name.Equals(listProp.Text))

{

foreach (QualifierData q in p.Qualifiers)

{

if (q.Name.Equals("Description"))

{

tDescr.Text = curClass.GetPropertyQualifierValue(p.Name, q.Name).ToString();

return;

}

}

}

}

}

catch (ManagementException ex)

{

tDescr.Text = ex.Message;

}

}

Аналогичные действия необходимо произвести при выборе строки в списке методов или описателей.

void listMethods_SelectedIndexChanged(object sender, EventArgs e)

{

if (curClass == null)

return;

btnGetValues.Visible = false;

try

{

lblDescr.Text = "Method: " + listMethods.Text;

foreach (MethodData m in curClass.Methods)

{

if (m.Name.Equals(listMethods.Text))

{

foreach (QualifierData q in m.Qualifiers)

{

if (q.Name.Equals("Description"))

{

tDescr.Text = q.Value.ToString();

return;

}

}

}

}

}

catch (ManagementException ex) { tDescr.Text = ex.Message; }

}

void listQualifiers_SelectedIndexChanged(object sender, EventArgs e)

{

if (curClass == null)

return;

btnGetValues.Visible = false;

try

{

lblDescr.Text = "Qualifier: " + listQualifiers.Text;

foreach (QualifierData q in curClass.Qualifiers)

{

if (q.Name.Equals(listQualifiers.Text))

{

tDescr.Text = q.Value.ToString();

return;

}

}

}

catch (ManagementException ex)

{

tDescr.Text = ex.Message;

}

}

Последним методом класса WMIControl будет обработка нажатия кнопки GetValues. Мы управляем видимостью этой кнопки (свойство Visible) так, чтобы она была видна при активизации списка свойств. Если фокус переходит в любой другой список, то кнопка становится невидимой. В функции обработки нажатия кнопки GetValues надо найти все объекты (ManagementObject) выбранного класса (ManagementClass) и для каждого из них получить значение того свойства, имя которого выбрано в списке свойств класса.