提升事件( "onchange" )



我有一个wform和一个WebBrowser控件,我正在更改选择HTML控件中的一个选项。

webBrowser1.Document
    .GetElementsByTagName("select")[4]
    .GetElementsByTagName("option")[13]
    .SetAttribute("selected", "true");

现在它可以工作并选择所需的选项,但它不会触发 onchange 事件。选择没有元素 ID,但它有一个类名。

我试过了:

webBrowser1.Document
    .GetElementsByTagName("select")[4]
    .RaiseEvent("onchange");

webBrowser1.Document
    .GetElementsByTagName("select")[4]
    .GetElementsByTagName("option")[13]
    .RaiseEvent("onchange");

但徒劳无功。

我尝试并在选择一个选项后发送了一个 TAB 键,它引发了 onchange 事件。

    webBrowser1.Document.GetElementsByTagName("select")[4].Focus();
    webBrowser1.Document.GetElementsByTagName("select")[4]
.GetElementsByTagName("option")[13].SetAttribute("selected", "true");
    SendKeys.Send("{TAB}");

现在一切都很好。

尝试引发 onChange 事件:例如 RaiseEvent("onChange");

编辑:它将在选择元素上,而不是选项上。

编辑2:

var selectControlElement = webBrowser1.Document
    .GetElementsByTagName("select")[4];
selectControlElement.RaiseEvent("onChange");

另外值得检查selectControlElement以查看它是否有任何事件。

另一种选择(未经我测试)

object obj = selectControlElement.DomElement;
System.Reflection.MethodInfo mi = obj.GetType().GetMethod("onchange");
mi.Invoke(obj, new object[0]);

也试试

selectControlElement.InvokeMember("onchange");

有关详细信息,请参阅下面的代码。

    void SetComboItem(string id, string value)
    {
        Forms.HtmlElement ddRouteSelected = wBrowser.Document.GetElementById(id);
        foreach (Forms.HtmlElement item in ddRouteSelected.Children)
        {
            if (item.InnerText != null && item.InnerText.ToLower().Equals(value.ToLower()))
            {
                item.SetAttribute("selected", "Selected");
                item.SetAttribute("value", value);
                ddRouteSelected.InvokeMember("onchange");
                break;
            }
        }
    }

最新更新