Во время навигации по дереву классов пользователь видит имена классов и, обнаружив интересующий его класс, выбирает его. Нам следует обработать событие выбора узла дерева классов и в коде его обработки заполнить данными три списка: 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) и для каждого из них получить значение того свойства, имя которого выбрано в списке свойств класса.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.