0

到目前为止,我在 WebBrowser 控件中提交表单的每个代码示例都将WebBrowser.Document.Forms[0].InvokeMember()参数硬编码为"submit".

这个参数必须总是“提交”吗?

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

如果不是,那么指定放置哪个字符串的规则是什么?它是否依赖于被访问页面的 HTML?

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

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

更新2:啊!我想我开始明白了:这是一个Javascript 内置方法。因此暗示了任何 DOM表单元素。

权威的答案是最受赞赏的。

4

2 回答 2

1

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

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

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

于 2012-10-21T19:32:56.863 回答
0

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

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

于 2012-10-23T16:04:18.260 回答