Lo que intento es lo siguiente:
-Obtengo código fuente de una página y lo cargo en A
-Cargo la página en el Webbrowser: WB.DocumentText= A
-Cuando cargue la página llama al evento ReadWeb
-ReadWeb obtiene datos en modo lista y lo Carga en una variable List
-Desde Button_Click llamo a la clase e intento obtener dicha lista.
Problema: No puedo obtener dicha lista.
Código
Class clsGetDataWeb Dim Lista As New List(Of String) Dim WB As New WebBrowser Dim strUrl As String = "http://www...." Dim WebSource As String = Nothing Public Sub GetDataWeb() '//OBTIENE EL CÓDIGO FUENTE DE LA PÁGINA Try WebSource = GetWebSource(strUrl) 'Obtiene el código de la página Catch ex As Exception MessageBox.Show(ex.Message) Exit Sub End Try 'LLama al evento DocumentCompletes AddHandler WB.DocumentCompleted, AddressOf WB_DocumentCompleted 'Carga el código html en WB WB.ScriptErrorsSuppressed = True WB.DocumentText = WebSource End Sub Private Sub WB_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) ReadWeb(WB) End Sub Private Sub ReadWeb(ByVal WBrowser As WebBrowser) Dim document As System.Windows.Forms.HtmlDocument = WBrowser.Document Dim doc As HtmlDocument = WBrowser.Document Dim divs As HtmlElementCollection = doc.GetElementsByTagName("td") Lista.Clear() For Each div As HtmlElement In divs If div.GetAttribute("classname") = "Canción" Then Lista.Add(div.InnerText) Next Lista= Lista.Distinct.ToList End Sub Private Function GetWebSource(ByVal strUrl As String) As String ...AQUÍ CÓDIGO PARA OBTENER EL CÓDIGO FUENTE DE LA PÁGINA WEB Return CódigoFuente End Function Public ReadOnly Property ParameterNames() As IEnumerable(Of String) Get Return New List(Of String)(Lista) End Get End Property End Class #End Region
Y desde el un evento click:
Código
'//Llamo a Dim ClassDW As New clsGetDataWeb ClassDW.GetDataWeb() For Each N As String In ClassDW.ParameterNames ListBox1.Items.Add(n) Next
He constatado por puntos de interrupción que el código de la página lo obtiene y la lista también. Creo que el problema tiene relación con Evento DocumentCompleted y la propiedad Get
parace como si se estableciese la propiedad antes de que se obtenga la lista
Gracias
[SOLUCIONADO]
Era lo que yo pensaba
Se carga la propiedad antes de que se obtenga la lista. Para solucionarlo he añadido un simple código de espera
Código
Public ReadOnly Property ParameterNames() As System.Collections.Generic.ICollection(Of String) Get While [LISTA].Count = 0 My.Application.DoEvents() End While Return New List(Of String)([LISTA]) End Get End Property