こんにちは。
DocumentCompletedがループ終了後にまとめて発生している事の直接的な原因ですが、
webBrowser.Url = new Uri(...)によって、即時に指定ドキュメントの読み込みが開始される訳ではない事 になると思います。
ご質問中コードのDoEventsでは回避できないと思います
このあたりの関連するイベントとしては、以下があります。
Navigating : 新しいドキュメントに移動する前に発生
Navigated : 新しいドキュメントに移動し、ドキュメントの読み込みを開始したときに発生
DocumentCompleted : ドキュメントの読み込みが終了したときに発生
正確な表現にはならないと思いますが、webBrowser.Url = ...の時点では読み込む(移動する)事が予約されているだけで、それが即時に開始される事は保障(?)されないと思います。
他のご質問も結果として同様の話だと思えます
【webBrowserイベント】
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser_events%28v=vs.110%29.aspx
簡単にイベント発生のタイミングを確認するコードを書いてみました。
C#
1 namespace WebBrowserEvent
2 {
3 public partial class Form1 : Form
4 {
5
6 public Form1 ( )
7 {
8 InitializeComponent ( ) ;
9 webBrowser1 . Navigating += new WebBrowserNavigatingEventHandler ( webBrowser1_Navigating ) ;
10 webBrowser1 . Navigated += new WebBrowserNavigatedEventHandler ( webBrowser1_Navigated ) ;
11 webBrowser1 . DocumentCompleted += new WebBrowserDocumentCompletedEventHandler ( webBrowser1_DocumentCompleted ) ;
12
13 System . Diagnostics . Trace . WriteLine ( "=====================================================================" ) ;
14 }
15
16 /// <summary>
17 /// button1のクリック
18 /// </summary>
19 /// <param name="sender"></param>
20 /// <param name="e"></param>
21 private void button1_Click ( object sender , EventArgs e )
22 {
23 System . Diagnostics . Trace . WriteLine ( ">> button1_Click start.\n" ) ;
24
25 webBrowser1 . Url = new Uri ( textBox1 . Text ) ;
26
27 // 良くないけれど10秒待機
28 System . Threading . Thread . Sleep ( 10 * 1000 ) ;
29
30 System . Diagnostics . Trace . WriteLine ( ">> button1_Click end.\n" ) ;
31 }
32
33 // 新しいドキュメントに移動する前に発生する
34 private void webBrowser1_Navigating ( object sender , WebBrowserNavigatingEventArgs e )
35 {
36 System . Diagnostics . Trace . WriteLine ( "[WebBrowserNavigating] URL : " + e . Url . ToString ( ) + "\n" ) ;
37 }
38 // 新しいドキュメントに移動し、ドキュメントの読み込みを開始したときに発生する
39 private void webBrowser1_Navigated ( object sender , WebBrowserNavigatedEventArgs e )
40 {
41 System . Diagnostics . Trace . WriteLine ( "[webBrowserNavigated] URL : " + e . Url . ToString ( ) + "\n" ) ;
42 }
43 // ドキュメントの読み込みが終了したときに発生する
44 private void webBrowser1_DocumentCompleted ( object sender , WebBrowserDocumentCompletedEventArgs e )
45 {
46 System . Diagnostics . Trace . WriteLine ( "[webBrowserDocumentCompleted] URL : " + e . Url . ToString ( ) ) ;
47 System . Diagnostics . Trace . WriteLine ( "> " + ( ( WebBrowser ) sender ) . Url . ToString ( ) + "\n" ) ;
48 }
49 }
50 }
(例)"http://www.google.co.jp"で確認した結果
乱暴なやり方ですが。。button1_Clickの中で10秒待機(Sleep)させていますが、Navigated(読み込みを開始)が発生しているのは、button1_Clickが終わってからになっています。
これを回避して期待する動作をさせるためには、yubaさんから頂いているようなDocumentCompletedイベントを使って繋いでいく(次へ移動させる)か、スレッドを起こす必要があると思います。
DocumentCompletedをチェックしつつ、タイマーで刻んで処理を進める事でも実現可能とは思えます
あまり良くなさそうですが・・・
一点注意が必要なのは、DocumentCompletedが複数発生するサイトが存在することです。これに対処するためにはDocumentCompletedで受け取る事が出来る値(object, ...EventArgs)を確認する等が必要になるかも知れません。
「((WebBrowser)object).Url 」や「e.Url 」あたり
基本的には待ち等含めて時間の掛かるような処理はClick他イベント内から外に出した方が良いと思います。
上記のコードでも10秒間のSleepがあり、その間フォームの操作(移動する等)が出来ないです。。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/15 04:21