C# 尝试在WebBrowser控件(AJAX)中选择下拉列表的值

C# 尝试在WebBrowser控件(AJAX)中选择下拉列表的值,c#,ajax,winforms,drop-down-menu,webbrowser-control,C#,Ajax,Winforms,Drop Down Menu,Webbrowser Control,我试图从第二个下拉列表中选择一个动态更新的值 下面是第二个下拉列表的代码: HtmlElementCollection select = x.GetElementsByTagName("select"); foreach (HtmlElement el in select) { if (el.Name == "color") { foreach (HtmlElement ele in el.GetElementsByTagName("option"))

我试图从第二个下拉列表中选择一个动态更新的值

下面是第二个下拉列表的代码:

HtmlElementCollection select = x.GetElementsByTagName("select");
foreach (HtmlElement el in select)
{
    if (el.Name == "color")
    {
        foreach (HtmlElement ele in el.GetElementsByTagName("option"))
        {
            //MessageBox.Show(ele.InnerHtml);
            if (ele.InnerText == "green")
            {
                ele.Focus();
                ele.SetAttribute("selected", "selected");
                el.InvokeMember("onchange");
                ele.RemoveFocus();
                break;
            }
         }
      }
   }
该代码可以工作,但仅当我使用MessageBox语句时。 如果我对MessageBox行进行注释,则不会选择下拉选项


MessageBox引发了什么事件?

我对您看到的行为没有解释,但在我过去广泛使用WebBrowser控件的工作中,我也遇到了一些无法解释的行为

无论如何,以下是一些你可以尝试的东西:

  • 我假设您通过其他方式验证了当您没有放置MessageBox语句时,if子句的内部部分是否得到执行
  • 只需将ele.InnerHtml分配给一个字符串(可以对该字符串执行某些操作,以确保JIT不会将其优化掉)。访问InnerHtml可能会触发元素中导致事件工作的某些内容
  • 不要设置“selected”属性并调用“onchange”,而是尝试设置IHTMLSelectElement的ele.selectedIndex
  • 通常,您不必显式地调用“onchange”。如果JavaScript代码订阅了该事件,IE应该自动调用该事件
  • 此方法是否在UI线程上执行?我发现当您从后台线程访问DOM时,WebBrowser的行为可能会很奇怪。如果不是UI线程,请使用Invoke将方法执行封送至UI线程

我已经尝试将ele.innerHtml分配给字符串,但得到了相同的结果。如果没有MessageBox,if子句将无法执行……它确实执行了,但下拉列表此时仅在项上。我在“if(el.Name==“color”)”之后添加了Application.DoEvents(),并且成功了。这并不让我感到惊讶;-)不知何故,这为文档或UI提供了填充或完成对象模型的时间,以便后续代码成功。但别问我为什么这是。。。