Мне нужно выбрать innerText из текущего выбранного параметра в элементе управления webBrowser.
Вот представление html:
<SELECT ID="F8">
<OPTION VALUE="option1">option1</OPTION>
<OPTION VALUE="option2" selected>option2</OPTION>
<OPTION VALUE="option3">option3</OPTION>
</SELECT>
Вот что я пытаюсь:
if (webBrowser1.Document.GetElementById("F8") != null)
{
HtmlElement selectF8 = webBrowser1.Document.GetElementById("F8");
foreach (HtmlElement item in selectF8.Children )
{
if (item.GetAttribute("selected") != null)
{
assigneeText.Text = item.InnerText;
}
}
}
... но он полностью игнорирует оператор if и всегда присваивает assigneeText.Text значение option3 вместо значения выбранного option2.
Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?
Ответ 1 · рейтинг 7 · Fraser
Выбранный атрибут не обновляется при изменении выбора элемента управления. Он используется для определения элемента, который выбирается (параметр по умолчанию) при первом отображении элемента управления.
Чтобы получить текущий выбор, вы должны вызвать метод selectedIndex, чтобы узнать, какой элемент выбран.
HtmlElement element = webBrowser1.Document.GetElementById("F8");
object objElement = element.DomElement;
object objSelectedIndex = objElement.GetType().InvokeMember("selectedIndex",
BindingFlags.GetProperty, null, objElement, null);
int selectedIndex = (int)objSelectedIndex;
if (selectedIndex != -1)
{
assigneeText.Text = element.Children[selectedIndex].InnerText;
}
Если вы используете С# 4, вы также можете использовать DLR, чтобы избежать использования отражения.
var element = webBrowser1.Document.GetElementById("F8");
dynamic dom = element.DomElement;
int index = (int)dom.selectedIndex();
if (index != -1)
{
assigneeText.Text = element.Children[index].InnerText;
}
Ответ 2 · рейтинг 1 · smitty1
Вскоре после того, как я опубликовал это, я нашел способ заставить это работать: Мое решение было
HtmlElement selectF8 = webBrowser1.Document.GetElementById("F8");
foreach (HtmlElement item in selectF8.Children)
{
if (item.GetAttribute("value") == webBrowser1.Document.GetElementById("F8").GetAttribute("value"))
{
assigneeText.Text = item.InnerText;
}
}
Кажется, это работает, хотя ответ Фрейзера является новым для C # и .net, он тоже работает и, вероятно, является лучшим решением.