DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン WebBrowser Control foreachで値が消える /げんむ (20/03/19(Thu) 16:25) #34436
Nomalアイコン Re[1]: WebBrowser Control foreachで値が消える /魔界の仮面弁士 (20/03/19(Thu) 16:57) #34437
  └Nomalアイコン Re[2]: WebBrowser Control foreachで値が消える /げんむ (20/03/23(Mon) 09:48) #34451 解決み!


親記事 / ▼[ 34437 ]
■34436 / 親階層)  WebBrowser Control foreachで値が消える
□投稿者/ げんむ 一般人(5回)-(2020/03/19(Thu) 16:25:20)
  • アイコン
    分類:[その他] 

    WebBrowser Controlを使って、任意の値を取得の続きの質問になります。
    
                elems = webBrowser1.Document.GetElementsByTagName("td");
    
                foreach (HtmlElement elem in elems)
                {
                    string style = elem.Style;
    
                    if (!(string.IsNullOrEmpty(style)) && style.Contains("font-weight: bold;"))
                    {
                        HtmlElementCollection a = elem.GetElementsByTagName("A");
                        string href = a[0].GetAttribute("href");
                        Debug.WriteLine(style);
                        Debug.WriteLine(href);
    
                        webBrowser1.Navigate(href);
    			//読み込みを待つ処理をここに書く
                    }
                }
    
    WebBrowserControlに表示されている画面からhrefを取得して、Navigateを使って違うページに移動しています。
    取得したURLをNavigateを使って順に巡ろうとしているのですが、うまくいきません。
    
    例えば、URLを10取得したとします。最初に取得したURLは問題なくNavigateを使って移動できますが、残りの9つのURLには移動することができません。
    ステップ実行で、elems = webBrowser1.Document.GetElementsByTagName("td");の中を確認すると10URL取得できています。
    遷移後に再びforeachに戻るとelemsの中身がなくなっています。
    
    なぜこのような事が起こるんでしょうか?解決するにはどうしたらいいのでしょうか?

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34436 ] / ▼[ 34451 ]
■34437 / 1階層)  Re[1]: WebBrowser Control foreachで値が消える
□投稿者/ 魔界の仮面弁士 大御所(1277回)-(2020/03/19(Thu) 16:57:40)
  • アイコン2020/03/19(Thu) 17:08:28 編集(投稿者)

    No34436に返信(げんむさんの記事)
    > URLを10取得したとします。最初に取得したURLは問題なくNavigateを使って移動できますが、残りの9つのURLには移動することができません。

    HTMLElementCollection を foreach で『列挙している最中』に
    Navigate を呼び出さないようにしてください。

    Navigate すると Document の内容にも影響するため、
    取得した URL はあらかじめ List<string> 等に書き出しておき、
    『列挙が終わった後』で、改めて Navigate しなおしてください。


    > //読み込みを待つ処理をここに書く

    この手の待機処理を組み込むべきではありません。

    ループ待機等でロード完了を待ち合わせるような設計にはせず、
    「DocumentCompleted イベント」を使用するようにしてください。


    Web ページのロードが完了するまでにはタイムラグがあります。
    ドキュメントのロードが完了すると、DocumentCompleted イベントが
    呼び出されるので、解析処理はこのイベントハンドラに記述します。

    また、WebBrowser は STAThread でのメッセージループを要求するため、
    Navigate してすぐに指定ドキュメントの読み込みが
    開始される訳ではありません。ロードが開始されるのは、
    アプリケーションがアイドル状態になってからです。



    Task 化して、Navigate → DocumentCompleted → 解析 → 再 Navigate が
    順次行われるような設計にはできるかもしれませんが…手続きを間違えると
    デッドロックを引き起こす可能性がありそう。
違反を報告
[ 親 34436 / □ Tree ] 返信 削除キー/

▲[ 34437 ] / 返信無し
■34451 / 2階層)  Re[2]: WebBrowser Control foreachで値が消える
□投稿者/ げんむ 一般人(1回)-(2020/03/23(Mon) 09:48:31)
  • アイコン>Navigate すると Document の内容にも影響するため、

    知りませんでした。どうりで自分の思っていることと違う挙動をしたわけです。

    >「DocumentCompleted イベント」を使用するようにしてください。

    わかりました!

    助かりました。ありがとうございます。


解決み!
違反を報告
[ 親 34436 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -