5

我需要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值 ofoption3而不是 selected 的值option2

有人可以告诉我我做错了什么吗?

4

3 回答 3

8

当您更改控件上的选择时,选定的属性不会更新。它用于定义第一次显示控件时选择的项目(默认选项)。

要获取当前选择,您应该调用该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;
}
于 2013-12-16T03:39:20.667 回答
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 的新手,但弗雷泽的回答也有效,可能是更好的解决方案。

于 2013-12-17T04:00:25.087 回答
1
foreach (HtmlElement item in elesex.Children)
{              
    if (item.GetAttribute("selected") == "True")
    {
        sex = item.InnerText;
    }
}
于 2016-05-17T09:36:30.240 回答