Clase y propiedades con Webbrowser

Iniciado por Lekim, 29 Noviembre 2015, 14:25 PM

0 Miembros y 1 Visitante están viendo este tema.

Lekim

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.

Código (vbnet) [Seleccionar]
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 (vbnet) [Seleccionar]
'//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 (vbnet) [Seleccionar]
   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