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


埼玉  2009-05-08 11:28:16  No: 141909

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 12:18:02  No: 141910

読み込み完了時には、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-09 01:08:14  No: 141911

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

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

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


魔界の仮面弁士  2009-05-09 01:17:37  No: 141912

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

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

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

End Sub


埼玉  2009-05-09 05:01:02  No: 141913

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

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

①ボタンを押す

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

i = i +1
Loop


魔界の仮面弁士  2009-05-09 07:44:50  No: 141914

> 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-09 08:32:52  No: 141915

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


魔界の仮面弁士  2009-05-09 12:59:46  No: 141916

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

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

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加