C# 是WebBrowser.Document.Forms[0]。InvokeMember()参数始终为;提交;?

C# 是WebBrowser.Document.Forms[0]。InvokeMember()参数始终为;提交;?,c#,winforms,webbrowser-control,form-submit,C#,Winforms,Webbrowser Control,Form Submit,到目前为止,我看到的每个代码示例都将WebBrowser.Document.Forms[0].InvokeMember()参数硬编码为“submit” 此参数必须始终为“提交” 如果是,那么为什么它是一个参数 如果不是,那么有什么规则来指定放在那里的字符串?它是否依赖于所访问页面的HTML 更新1:清楚地显示了使用“提交”以外的值的示例。所以,至少我得到了答案:不 但我仍然不明白什么时候应该使用“提交”和“移动行”:在我通过“提交”处理的网页中,没有提到该字符串,但它工作得很好。网页中隐含的“提

到目前为止,我看到的每个代码示例都将
WebBrowser.Document.Forms[0].InvokeMember()
参数硬编码为
“submit”

此参数必须始终为“提交”

如果是,那么为什么它是一个参数

如果不是,那么有什么规则来指定放在那里的字符串?它是否依赖于所访问页面的HTML

更新1:清楚地显示了使用“提交”以外的值的示例。所以,至少我得到了答案:

但我仍然不明白什么时候应该使用“提交”和“移动行”:在我通过“提交”处理的网页中,没有提到该字符串,但它工作得很好。网页中隐含的“提交”隐藏在哪里

更新2:啊!我想我开始明白了:这是一个好消息。因此对任何DOM元素都是隐含的

一个权威的答案是最受欢迎的。

不,它不必是“提交”。但这肯定是你在表单中使用过的最流行的方法。Winforms HtmlDocument和HtmlElement类是DOM接口的包装器。本例中的核心是IHtmlDocument2(匹配的HtmlDocument)和IHtmlElement2(匹配的HtmlElement)。使用大量特定的接口类型,如IHtmlFormElement来表示DOM中的表单对象。但是,如果Winforms中没有匹配的类,HtmleElement会将它们全部封装起来。这就是为什么需要使用InvokeMember(),这与反射的类型相同。它弥补了HtmleElement没有包装的方法。类似于IHtmlFormElement::submit()

HtmleElement的一个优点是它可以帮助您避免这些DOM接口版本的困境。例如,IHtmlDocument有七个版本。每次微软改进IE时,他们往往不得不创建另一个版本的界面,添加额外的成员


你当然可以早用。添加对c:\windows\system32\mshtml.tlb的引用。将WebBrowser.ActiveXInstance强制转换为mshtml.IHtmlDocument以使用它。

InvokeMember通过IDispatch::Invoke调用表单元素的方法/属性。您可以从IE文档中找到可以调用的方法和属性列表


通过IE的类型库进行更轻松的绑定可以确保类型安全,但您需要为方法/属性找到正确的接口,这意味着对于表单元素,如果在IHTMLFormElementX下找不到方法/属性,则需要在IHTMLElementX下查找

这是一个很有教育意义和帮助的答案。非常感谢。