smitty1 smitty1 - 6 months ago 29
HTML Question

How to get the innerText from currently selected option in a webBrowser control

I need to select the

innerText
from the currently selected option in the webBrowser control.

Here is a representation of the html:

<SELECT ID="F8">
<OPTION VALUE="option1">option1</OPTION>
<OPTION VALUE="option2" selected>option2</OPTION>
<OPTION VALUE="option3">option3</OPTION>
</SELECT>


Here is what I am trying:

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;
}
}
}


... but it completely ignores the if statement and always assigns
assigneeText.Text
the value of
option3
instead of the value of the selected
option2
.

Can someone please tell me what I am doing wrong?

Answer

The selected attribute doesn't get updated when you change the selection on the control. It is used to define the item that is selected (default option) when the control is first displayed.

To get the current selection you should invoke the selectedIndex method to find out which item is selected.

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;
}

If you are using c# 4 you can also use the DLR to avoid having to use reflection.

var element = webBrowser1.Document.GetElementById("F8");
dynamic dom = element.DomElement;
int index = (int)dom.selectedIndex();
if (index != -1)
{
  assigneeText.Text = element.Children[index].InnerText;
}
Comments