2016-02-12 9 views
5

Sto usando l'operatore in background per manipolare alcuni elementi sul mio web browser usando vb.net.Verificare se l'elemento esiste in WebBrowser utilizzando BackgroundWorker

Ad esempio, l'operatore in background RFIDReader verificherà se sono su un collegamento specifico.

ElseIf TerminalBrowser.Url.ToString.Contains(baseUrl + "box-office/ticket-verification") And rf_code <> "" Then 

    ' Insert RF Code in "rf_code" hidden text field 
    Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("rf_code").SetAttribute("value", rf_code.ToLower)) 

End If 

Quello che succede qui è se tocchio la mia carta RFID. Comprenderà il valore corrispondente al mio elemento rf_code nel mio browser.

Ora quello che voglio succedere è, voglio controllare se il contenitore stesso (synchronize-rfid) esiste (visto che è un pop up). Vedi l'immagine per riferimento.

enter image description here

Ecco il nostro codice per questo.

If Me.TerminalBrowser.Document.GetElementById("synchronize-rfid") IsNot Nothing Then 
    ' Code here 
end if 

Riferimento: https://stackoverflow.com/a/2022120/1699388

Il problema è, BackgroundWorker non interagisce realmente con UI secondo il codice di cui sopra.

Esiste un metodo per determinare se quell'elemento esiste utilizzando l'operatore in background?

Penso di averlo fatto e non funziona comunque.

Dim synchronize_rfid = Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("synchronize-rfid")) 
If synchronize_rfid IsNot Nothing Then 
    ' Code here 
end if 
+0

Che cosa significa "non funziona se" significa? eccezione generata, non il risultato che ti aspetti, ecc.? – TnTinMn

+0

@TnTinMn, il codice stesso non controlla se l'elemento 'synchronize_rfid' esiste. Ho provato a inviare una finestra di messaggio all'interno dell'istruzione if, ma non entra. –

+0

'Me.Invoke (Sub() Me.TerminalBrowser.Document.GetElementById (" synchronize-rfid "))' restituirà sempre un valore di Nothing in quanto una subroutine non restituisce un valore. Supponendo che TerminalBrowser sia il riferimento corretto, sarà necessario utilizzare una funzione lambda rispetto al metodo lambda nell'istruzione 'Me.Invoke'. Il motivo per cui è "TerminalBrowser è il riferimento corretto" è perché si indica che l'elemento si trova in una finestra popup e che potrebbe essere un'istanza del browser diversa. – TnTinMn

risposta

2

Provare prima a dichiarare la variabile, quindi impostarla durante l'invocazione (che verrà impostata dal thread principale).

Il Sub() lambda si comporta come un normale Sub() - metodo End Sub, il che significa che si possono fare le stesse cose in là come se si avesse un metodo separato.

Questo funziona per me:

Dim synchronize_rfid As HtmlElement 
If Me.InvokeRequired = True Then 
    Me.Invoke(Sub() synchronize_rfid = Me.TerminalBrowser.Document.GetElementById("synchronize-rfid")) 
Else 
    synchronize_rfid = Me.TerminalBrowser.Document.GetElementById("synchronize-rfid") 
End If 

If synchronize_rfid IsNot Nothing Then 
    ' Code here 
End If 
+0

Sembra che il tempo stia per finire, lo farò sulla mia pagina fittizia solo per verificare se esiste un elemento che utilizza quel codice.Non ho l'attrezzatura necessaria per testare dove dovrei davvero provarlo. Ma funziona in entrambi i modi. Questo funziona davvero, ma ho una domanda. Se commento o rimosso all'interno dell'istruzione if o dell'istruzione, si sbaglia però. –

+0

Oh, non importa. Ha appena detto che potrebbe risultare in valore nullo, mi ha solo avvertito. Grazie comunque. Il mio male per la risposta in ritardo. Non ho comunicato con te da quando non l'ho testato, facendo un paio di progetti. –

+0

@WesleyLachenal: Oh, non c'era davvero fretta. Ho appena controllato perché pensavo che fosse strano che non avessi ricevuto alcuna risposta. Beh, sono contento che abbia funzionato per te. :) –