0

これまで見てきたWebBrowserコントロール内でフォームを送信するためのすべてのコード例では、WebBrowser.Document.Forms[0].InvokeMember()パラメーターをとしてハードコードしています"submit"

このパラメータは常に「送信」する必要がありますか?

もしそうなら、なぜそれはパラメータなのですか?

そうでない場合、そこに配置する文字列を指定するためのルールは何ですか?アクセスしているページのHTMLに依存していますか?

更新1:InvokeMember()のドキュメントには、「submit」以外の値を使用する例が明確に示されています。だから、少なくとも私は答えを得ました:いいえ

しかし、いつ「submit」を使用すべきか、いつ「moveRow」を使用すべきかはまだわかりません。「submit」を介して処理しているWebページには、その文字列についての言及はありませんが、完全に機能します。Webページに隠れている暗黙の「送信」はどこにありますか?

アップデート2:ああ!私はそれを手に入れ始めていると思います:それはJavascriptの組み込みメソッドです。したがって、すべてのDOMフォーム要素に対して暗黙的に示されます。

信頼できる答えをいただければ幸いです。

4

2 に答える 2

1

いいえ、「提出」である必要はありません。しかし、これは間違いなくフォームで使用する最も一般的な方法です。Winforms HtmlDocument および HtmlElement クラスは、DOM インターフェイスのラッパーです。この場合のコアは、IHtmlDocument2 (HtmlDocument に一致) と IHtmlElement2 (HtmlElement に一致) です。DOM でフォーム オブジェクトを表す IHtmlFormElement など、多数の特定のインターフェイス タイプを使用します。しかし、Winforms のクラスに一致するクラスがない場合、HtmlElement はそれらすべてをラップします。これが、リフレクションの Type.InvokeMember() と同じ考え方である InvokeMember() を使用する必要がある理由です。HtmlElement でラップされていないメソッドを補います。IHtmlFormElement::submit() と同様です。

HtmlElement の利点の 1 つは、これらの DOM インターフェースのバージョンの煩わしさを回避できることです。たとえば、IHtmlDocument には 7 つのバージョンがあります。Microsoft が IE を改善するたびに、メンバーを追加してインターフェイスの別のバージョンを作成する必要がある傾向があります。

確かに早期バインドを使用できます。c:\windows\system32\mshtml.tlb への参照を追加します。WebBrowser.ActiveXInstance を mshtml.IHtmlDocument にキャストして使用します。

于 2012-10-21T19:32:56.863 に答える
0

InvokeMember は、IDispatch::Invoke を介してフォーム要素のメソッド/プロパティを呼び出します。呼び出すことができるメソッドとプロパティのリストは、フォーム要素に関する IE のドキュメントから見つけることができます。

IE のタイプ ライブラリを介した簡単なバインドにより、型の安全性が確保されますが、メソッド/プロパティの正しいインターフェイスを見つける必要があります。つまり、フォーム要素の場合、メソッド/プロパティが IHTMLFormElementX の下に見つからない場合は、IHTMLElementX の下を調べる必要があります。

于 2012-10-23T16:04:18.260 に答える