Hi
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.
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:
'//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
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