Mattia
Mattia

Reputation: 258

Loop through each item in Listbox and load a webpage

I'm trying to load a new webpage through the control webview2 in .net6+ windows forms, and I'm using a listbox to extract any single item and add it to the url to load on webview. For example in listbox I have:

11
22
33
44
55

I would like at the press of a button that a loop starts to load one by one,each of these items like

 WebView21.Source = New Uri("https://google.it" & ListBox1.Items.first & "rest of the url")

and after the webpage is loaded, it s supposed to extract it's html to check if a certain string is present with

Dim html As String
       html = Await WebView21.ExecuteScriptAsync("document.documentElement.outerHTML;")
       If html.Contains("Not found") Then
           MsgBox("In Vacanza")
       Else
           MsgBox("Attivo")
       End If
   End Sub

after that, it goes back to the second listbox item, load the webview, check the html and so on.

My question is how can I loop the WebView in order to pick each of the items one by one and to proceed to do these little things in the while? p.s. Once the loop arrives to the last listbox item, would it be possible to start it again from the first item? Much thanks

edit1:

I'm trying with

 Private ReadOnly resetEvent As New ManualResetEvent(False)

    Async Sub scanWeb()
        For Each listBoxElem As String In ListBox1.Items
            resetEvent.Reset()
            AddHandler WebView2.CoreWebView2.NavigationCompleted, AddressOf OnNavigationCompleted
            WebView2.Source = New Uri("https://ikalogs.ru/tools/map/?page=1&server=22&world=10&state=active&search=city&allies%5B1%5D=&allies%5B2%5D=&allies%5B3%5D=&allies%5B4%5D=&nick=" & listBoxElem & "&ally=&island=&city=&x=&y=")
            Await Task.Run(Sub() resetEvent.WaitOne())
            RemoveHandler WebView2.CoreWebView2.NavigationCompleted, AddressOf OnNavigationCompleted
            Dim html As String
            html = Await WebView2.ExecuteScriptAsync("document.documentElement.outerHTML;")
            If html.Contains("Not found") Then
                DataGridView1.Rows.Add(listBoxElem, "IN vacanza")
            Else
                DataGridView1.Rows.Add(listBoxElem, "Attivo")
            End If
        Next
    End Sub

    Private Sub OnNavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs)
        resetEvent.Set()
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        WebView2 = New WebView2()
        WebView2.EnsureCoreWebView2Async()
    End Sub

but it seems the loop doesn't wait for the process to end and it goes straight to the next listbox item...

Upvotes: 0

Views: 151

Answers (1)

tuyau2poil
tuyau2poil

Reputation: 927

best way is to enumerate listBox items in a for-each loop : (I added an escape way -simple mouse clic on form - to quit loop)

    Dim wStop As Boolean
    
    sub scanWeb()
     Do
       For Each listBoxElem As String In ListBox1.Items
         WebView21.Source = New Uri("https://google.it" & listBoxElem & "rest of the url")
         'etc....
       Next
     Loop Until wStop = True
     wStop = False
    end sub
   
    'way to stop scan 
    Private Sub form_clic(sender As Object, e As MouseEventArgs) Handles MyBase.MouseClick
      wStop = True
    End Sub

*** Update *****

The webview2 control is rather made to display data, and I have no experience on it. Also I suggest you use a simpler method, based on System.Net.WebClient() and associated with threading. Here is a start of code that works:

Dim wStop As Boolean
Dim i As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim BackProcess = New Thread(Sub() Me.scanWeb())
    BackProcess.Priority = ThreadPriority.Normal
    BackProcess.Start()
end sub

Sub scanWeb()
    Do While Not wStop
        Dim WC As New System.Net.WebClient()
        'change url for your need
        Dim url As String = "https://www.google.fr/search?q=" & ListBox1.Items(i)
        Dim s As System.IO.Stream = WC.OpenRead(url)
        Dim sr As New System.IO.StreamReader(s)
        Dim html As String = sr.ReadToEnd()
        If html.Contains("Not found") Then 'beginInvoke allows the back task to communicate with UI
        Me.BeginInvoke(Sub() DataGridView1.Rows.Add(ListBox1.Items(i), "In vacanza"))
        Else
        Me.BeginInvoke(Sub() DataGridView1.Rows.Add(ListBox1.Items(i), "Attivo"))
    End If
    
    i += 1
    If i > ListBox1.Items.Count - 1 Then i = 0
Loop
End Sub
    
  'button event to stop scanning
Private Sub stopScan_Click(sender As Object, e As EventArgs) Handles stopScan.Click
   wStop = True
End Sub

Upvotes: 0

Related Questions