WebBrowserがロード完了したことを受け取る方法


埼玉  2009-05-08 02:28:16  No: 141909  IP: [192.*.*.*]

VB2008使用です。
WebBrowserがロード完了したことを受け取る方法を知りたいです。

IEを起動するパターンですと、以下のような方法がありましたが
WebBrowserを使用する場合どのような方法がありますでしょうか?

WebBrowserロードが完了してから次の動作に移りたいです。

            'IEを起動する
            objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
            objIE.Visible = True
            objIE.Navigate(strNAME)

            '開ききるまで待つ処理。
            Do While objIE.Busy = True '特に何もしないで.Busyの状態が変わるまで待つ
            Loop
            Do While objIE.ReadyState <> 4 '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
            Loop

編集 削除
魔界の仮面弁士  2009-05-08 03:18:02  No: 141910  IP: [192.*.*.*]

読み込み完了時には、DocumentCompleted イベントが発生しますので、
そこで「次の動作」を行うようにすれば OK です。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.documentcompleted.aspx



> '開ききるまで待つ処理。
ループ待機は避けた方が良いかと思いますよ。

たとえば、「CheckBox がチェックされたときに処理を開始する」場合、
チェックされたかどうかをループ監視したりはしないですよね。
通常はイベントを使って処理されているかと思います。それと同じことです。


InternetExplorer オブジェクトも、WebBrowser と同様に、
DocumentCompleted イベントで処理することができます。
http://msdn.microsoft.com/en-us/library/aa768329.aspx

編集 削除
埼玉  2009-05-08 16:08:14  No: 141911  IP: [192.*.*.*]

上記確認させていただいたのですが、いまいちよくわかりません。

WebBrowser.DocumentCompletedについてなのですが

簡単なサンプルいただけませんでしょうか?

編集 削除
魔界の仮面弁士  2009-05-08 16:17:37  No: 141912  IP: [192.*.*.*]

>>> WebBrowserロードが完了してから次の動作に移りたいです。
> 簡単なサンプルいただけませんでしょうか?

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        'ここに「次の動作」を記述

End Sub

編集 削除
埼玉  2009-05-08 20:01:02  No: 141913  IP: [192.*.*.*]

魔界の仮面弁士 様ご指導ありがとうございます。
魔界の仮面弁士 様のソースを設置してみたところ確かに初回はおもう動作をするのですが

以下ような形にしたいです。

①ボタンを押す

I = 1
Do i = 5
"http://aaa.com/" + i + "html" 'を開く
'(完了まで待つ)

i = i +1
Loop

編集 削除
魔界の仮面弁士  2009-05-08 22:44:50  No: 141914  IP: [192.*.*.*]

> Do i = 5
Do While では無さそうなので、Do Until の意味でしょうか。
であれば、こうかな…。

Public Class Form1
    Private htmlIndex As Integer

    Private Sub Navigate(ByVal index As Integer)
        Dim URL As String = String.Format("http://aaa.com/{0}.html", index)
        WebBrowser1.Navigate(URL)
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Me.Text = e.Url.ToString()
        htmlIndex += 1
        If htmlIndex < 5 Then
            Navigate(htmlIndex)
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        htmlIndex = 1
        Navigate(htmlIndex)
    End Sub
End Class

編集 削除
埼玉  2009-05-08 23:32:52  No: 141915  IP: [192.*.*.*]

たびたびありがとうございます。
上記のソースだと、ループや連続でボタンを押したときに読み込みが終了するまえに、次のナビゲートにいってしまいます。。。

編集 削除
魔界の仮面弁士  2009-05-09 03:59:46  No: 141916  IP: [192.*.*.*]

> 上記のソースだと、ループや連続でボタンを押したときに読み込みが終了するまえに、次のナビゲートにいってしまいます。。。

連続押下に関しては、最初の Click 時に Button1.Enabled = False 等を
仕込んでおけば対処できますね。


ところで、ここでいうループとは、どのような意味でしょうか?

Loop ステートメントの意味だとすれば、そもそも私のソースでは
それを使わないようなコードにしているはずです。

Navigate によって、次の DocumentCompleted イベントが発生するという点では
確かにループ処理であると言えますが、それは読み込みが終了した後に
起きることであって、読み込み完了前に起きることは無いと思いますよ。


ただし、framesetが利用されている Webページを表示させた場合は別です。
フレームがあると、それぞれのフレームごとに DocumentCompleted が発生します。
そのため先のコードでフレーム付きのページを読み込ませた場合、内側のフレームの
読み込み完了時にも htmlIndex が増加してしまいます。それを避ける必要が
ある場合には、DocumentCompleted にて e.URL をチェックするようにしてみてください。

編集 削除