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

3

5

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?

Pragmaticism answered 16/12, 2013 at 3:26 Comment(0)
M
8

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;
}
Mcleod answered 16/12, 2013 at 3:39 Comment(1)
Thanks.. this works! I found another solution below, but this is probably better than my solution...Pragmaticism
P
1

Shortly after I posted this, I figured out a way to make this work: My solution was

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

This seems to work, although being new to C# and .net, Fraser's answer works too and is probably the better solution.

Pragmaticism answered 17/12, 2013 at 4:0 Comment(0)
B
1
foreach (HtmlElement item in elesex.Children)
{              
    if (item.GetAttribute("selected") == "True")
    {
        sex = item.InnerText;
    }
}
Bloomington answered 17/5, 2016 at 9:36 Comment(1)
The selected attribute doesn't tell you if the given element is selected by the user - and doesn't change when a selection is made, it simply specifies that an option should be pre-selected when the page loads. It has no use outside that scope.Mcleod

© 2022 - 2024 — McMap. All rights reserved.