Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: smitty1Ответов: 2

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

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

htmlwebbrowser-controlinnertext

Ответы

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы