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 をチェックするようにしてみてください。


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




  


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