Два примера выполнения одной и той же задачи с использованием интерфейса mshtml.HTMLDocument и объекта WebBrowser Document .
При обработке события DocumentCompleted мы сначала проверяем его ReadyState .Если это не WebBrowserReadyState.Complete , текущий документ все еще не готов для анализа.Обратите внимание, что у вас может быть более одной HtmlDocument
на HTML
страницу (кадры и IFrames имеют свой персональный документ), поэтому это событие может вызываться несколько раз на странице.
WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
Чтобы избежать предупреждения или ошибки Late Bound, приведите WebBrowser HtmlDocument
к локальной переменной того же типа.То же самое, если вы используете интерфейс mshtml.HTMLDocument
:
Dim wbDoc As HtmlDocument = DirectCast(sender, WebBrowser).Document
Dim htmlDoc As mshtml.HTMLDocument = DirectCast(wbDoc.DomDocument, mshtml.HTMLDocument)
Как видно из двух фрагментов кода, при использовании любого из этих объектов разница заключается в том, чторегистр - почти не существует:
Использование mshtml.HTMLDocument
:
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Then Return
Dim startingRow As Integer = 3
Dim wbDoc As HtmlDocument = DirectCast(sender, WebBrowser).Document
Dim htmlDoc As mshtml.HTMLDocument = DirectCast(wbDoc.DomDocument, mshtml.HTMLDocument)
Dim firstTable As mshtml.HTMLTable = htmlDoc.getElementsByTagName("TABLE").OfType(Of mshtml.HTMLTable)().FirstOrDefault()
If firstTable IsNot Nothing Then
For tableRow As Integer = startingRow To firstTable.rows.length - 1
Dim row As mshtml.HTMLTableRow = DirectCast(firstTable.rows.item(tableRow), mshtml.HTMLTableRow)
For col As Integer = 0 To 1
Dim rowCell = DirectCast(row.cells.item(col), mshtml.HTMLTableCell)
If rowCell IsNot Nothing Then
rowCell.innerText = rowCell.innerText?.Replace(" ", "")
Else
'Decide what to do if the cell content is null
End If
Next
Next
End If
End Sub
Использование WebBrowser.Document
напрямую:
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Then Return
Dim startingRow As Integer = 3
Dim doc As HtmlDocument = DirectCast(sender, WebBrowser).Document
Dim firstTable As HtmlElement = doc.GetElementsByTagName("TABLE").OfType(Of HtmlElement)().FirstOrDefault()
If firstTable?.Children.Count > 0 Then
For tableRow As Integer = startingRow To firstTable.Children.Count - 1
Dim rowCells As HtmlElementCollection = firstTable.Children(tableRow).Children
If rowCells Is Nothing Then Continue For
For col As Integer = 0 To 1
If Not String.IsNullOrEmpty(rowCells(col).InnerText) Then
rowCells(col).InnerText = rowCells(col).InnerText.Replace(" ", "")
Else
'Decide what to do if the cell content is null
End If
Next
Next
End If
End Sub