Как получить innerText из выбранной в данный момент опции в элементе управления webBrowser

Мне нужно выбрать 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.

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?


person smitty1    schedule 16.12.2013    source источник


Ответы (3)


Выбранный атрибут не обновляется при изменении выбора элемента управления. Он используется для определения элемента, который выбирается (параметр по умолчанию) при первом отображении элемента управления.

Чтобы получить текущий выбор, вы должны вызвать метод 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;
}
person Fraser    schedule 16.12.2013
comment
Спасибо .. это работает! Я нашел другое решение ниже, но это, вероятно, лучше, чем мое решение... - person smitty1; 17.12.2013

Вскоре после того, как я опубликовал это, я нашел способ заставить это работать: Мое решение было

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, он тоже работает и, вероятно, является лучшим решением.

person smitty1    schedule 17.12.2013

person    schedule
comment
Атрибут selected не сообщает вам, выбран ли данный элемент пользователем, и не изменяется при выборе, он просто указывает, что параметр должен быть предварительно выбран при загрузке страницы. Он не имеет смысла вне этой сферы. - person Fraser; 19.07.2017