Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117

    [VB.NET] Errore che scompare se rieseguo solo una parte di codice

    Ciao a tutti

    Vado subito alla questione:
    Apro un Url con webbrowser e, dopo aver compilato un form, lo invio ricevendo una pagina con una tabella.

    Per estrarre alcuni dati della tabella ho cercato di usare questo codice:
    codice:
    Dim WebDoc As MSHTML.IHTMLDocument = DirectCast(WebBrowser1.Document.DomDocument, MSHTML.IHTMLDocument)
    Dim FTbl As MSHTML.IHTMLTable = WebDoc.getElementById("F_Hjr")
    Dim aElems As MSHTML.IHTMLElementCollection = FTbl.GetElementsByTagName("a")
    Al momento di valorizzare aElems ricevo NullReferenceException perché Ftbl risulta nothing.

    Il fatto strano è questo:
    se eseguo il codice in debug e, prima di arrivare all'errore, esco dalla sub e poi la riavvio saltando tutto (quindi senza ricaricare la pagina web che è ancora nel webbrowser) il codice funziona perfettamente e sia FTbl che aElems vengono correttamente valorizzati.

    Allora mi viene da pensare che il codice è corretto ma, per qualche oscura ragione, non funziona.
    Qualcuno saprebbe dirmi quale può essere questa ragione?

    Grazie in anticipo a chiunque tenterà di aiutarmi

  2. #2
    Il codice in questione in che evento viene eseguito? Perché tipicamente questo problema si ha se stai cercando di lavorare su un controllo webbrowser che non ha ancora finito di caricare la pagina che gli hai detto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Innanzi tutto grazie per la risposta.
    Il codice viene eseguito alla pressione di un pulsante ed il controllo webbrowser è sul Form.

    Che la pagina potesse essere non caricata ci avevo pensato e, per riscontro ho eseguito il codice in debug.
    Ho aspettato molto ma niente: FTbl continuava ad essere nothing.
    Se, invece,
    1) spostavo la riga in esecuzione su End Sub
    2) ricliccavo il pulsante (con interruzione alla prima riga)
    3) portavo la riga in esecuzione sul codice che ho postato
    RISULTATO: le variabili venivano correttamente valorizzate.

    Cercando in giro ho visto qualcosa sull'evento DocumentCompleted ma non l'ho mai usato e non mi è chiara la logica che dovrei usare.

    In un suggerimento ho trovato questo (collegato ad un loop per attendere la modifica della variabile):
    codice:
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        LoadedUrl1 = "Ok"
        Exit Sub
    End Sub
    ma non mi convince perché nell'esempio sul sito MSDN il codice da eseguire viene inserito all'interno di una sub richiamata da AddHandler collegato al verificarsi dell'evento DocumentCompleted.

    Nel mio caso, considerato che il codice postato si trova all'interno di un ciclo (15 pagine web da aprire i cui estratti finiranno in una DataGridView), quale struttura dovrei dare all'operazione?

    Grazie in anticipo
    P.S. chiedo scusa per eventuali assurdità ma sono un autodidatta (ed anche da relativamente poco).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.