- ベストアンサー
(VB)WebBrowserの値が更新されない
- VisualStudio2008の環境でFormにWebBrowserを配置し、Html内の値を取得するプログラムを作成しています。しかし、1秒ごとに動かすと一定時間経過後に値が取得できなくなります。
- Timer処理は正常に行われ、TextBoxに値を入れる箇所も通っています。ただ、Html内のデータが更新されていないように思えます。
- 解決策があればご教示ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは WebBrowser1_DocumentCompletedを使うと完全に要素が読み込まれたときに発生しますので、簡単に装着できます、 また、For Eachのときにあまり高速にするとミスっちゃいますのでFor Eachのなかでタイマーを仕掛けてください。 サンプルです。 Public Class Form1 Private Sub f() Handles MyBase.Shown WebBrowser1.Navigate("http://kagoturikentarou.dousetsu.com/axWindowsMediaPlayer4.html") End Sub Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted If sender.url.ToString <> e.Url.ToString Then Exit Sub End If For Each he_TR As HtmlElement In WebBrowser1.Document.GetElementsByTagName("td") If he_TR.GetAttribute("align") = "center" Then Threading.Thread.Sleep(1000) Application.DoEvents() TextBox1.Text = he_TR.InnerText End If Next End Sub End Class
その他の回答 (1)
- 田中 裕之(@bybalsendercase)
- ベストアンサー率88% (56/63)
おはようございます すいません、訂正です。 InnerTextをTextBoxで表示すると人間にはサイト内の最後の値しか見えませんので、ListBoxに表示して見えるかたちのサンプルに変更しました。 サンプルでは、違うURLを2秒間隔で交互に読み込んでいます。 <td>にidが設定されていませんので、<td align="center">のalign="center"をIf文に表記しました(本当は必要ありませんが) WebBrowserにhtmlが読み込まれるときに複数のURLが出てき、余分なURLを排除するため、1秒間隔で読み込むとかなり厳しいです。 サンプルでは2秒間隔にしました。 >一定時間経過で(5分くらい?)値が取得できなくなります。 この現象はWebBrowser1.Navigate(~~~~)で一度ログインしたり、一度表示したので、2回目からは省略でhtmlの要素を取得しようとするとなっちゃいますが、それと同じ現象かな~ サンプルです。 Public Class Form1 Private Sub f() Handles MyBase.Shown '一秒ごとにTimer1イベントを起動する Timer1.Enabled = True Timer1.Interval = 2000 End Sub Dim i As Integer 'カウンター Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 'カウンターの値によって WebBrowser1のURLを変更する If i = 0 Then WebBrowser1.Navigate("http://kagoturikentarou.dousetsu.com/loginstart.html") i += 1 ElseIf i = 1 Then WebBrowser1.Navigate("http://kagoturikentarou.dousetsu.com/axWindowsMediaPlayer4.html") i = 0 End If End Sub 'htmlの要素が完全に読み込まれたら発生するイベント Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted '一度ListBox1を空にする ListBox1.Items.Clear() '目的のURLと違うURLが読み込まれたらプロシージャを抜ける If sender.url.ToString <> e.Url.ToString Then Exit Sub End If '<td>属性がalign = "center"の値をListBox1に表示 For Each he_TR As HtmlElement In WebBrowser1.Document.GetElementsByTagName("td") If he_TR.GetAttribute("align") = "center" Then ListBox1.Items.Add(he_TR.InnerText) End If Next End Sub End Class