2013-12-16 2 views
4

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

... но она полностью игнорирует, если заявление и всегда присваивает assigneeText.Text Значение option3 вместо значения выбранного option2.

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

ответ

6

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

Чтобы получить текущий выбор, вы должны вызвать метод 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; 
} 

Если вы используете C# 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; 
} 
+1

Спасибо .. это работает! Я нашел другое решение ниже, но это, вероятно, лучше, чем мое решение ... – smitty1

1

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

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

1
foreach (HtmlElement item in elesex.Children) 
{    
    if (item.GetAttribute("selected") == "True") 
    { 
     sex = item.InnerText; 
    } 
} 
+0

Выбранный атрибут не говорит вам, выбран ли данный элемент пользователем - и не изменяется при выборе, он просто указывает что опция должна быть предварительно выбрана при загрузке страницы. Это не имеет смысла за пределами этой сферы. – Fraser