Сбой WebBrowser при последующем использовании?WebBrowser1_DocumentCompleted не работает - PullRequest
0 голосов
/ 18 февраля 2019

Окна VB.Net создаются с использованием «WebBrowser» и HTMLDocument, HTMLTable, HTMLTableRow для извлечения innerText строки, столбца таблицы HTML.Он работает только в первый раз, но не работает в последующий.

    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    Dim stockNo As String = ""
    Dim stockName String

    Dim doc As mshtml.HTMLDocument
    Dim table As mshtml.HTMLTable
    Dim rows As mshtml.HTMLTableRow

    doc = WebBrowser1.Document.DomDocument
    table = doc.getElementsByTagName("TABLE").item(0)
    For r = 3 To table.rows.length - 1
        rows = table.rows.item(r)

        Try
            stockNo = Replace(rows.cells(0).innerText, " ", "")
            stockName = Replace(rows.cells(1).innerText, " ", "")

        Catch ex As Exception
            Console.WriteLine("Error here: =====> " & ex.ToString)
            Console.WriteLine(rows.cells(0))              
        End Try
    Next r
End Sub    

Вот ошибка при выполнении для "rows.cells (0) .innerText"

Error here: =====> System.NotSupportedException: 發生例外狀況於 HRESULT: 0x800A01B6 
Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack)    
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)    

Также попробуйте WebBrowser1_ProgressChanged, но все еще не работает.Любая подсказка помогает.Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Наконец, на мой взгляд, " убедитесь, что все приведения и преобразования сделаны явно ." Из jmcilhinney правильно.

rows.cells(0).innerText    ===> Will fail on the subsequent use but do not know why the first time is OK

rows = table.rows.item(r)  ====> OK, if all casts and conversions are done explicitly
cell0 = rows.cells.item(0)

Спасибо ...

0 голосов
/ 18 февраля 2019

Два примера выполнения одной и той же задачи с использованием интерфейса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...