none
Errores en Código convertido de C# a VB.NET RRS feed

  • Pregunta

  • Hola, modifique un código de C# a VB y me quedaron dos errores importantes que no puedo identificar.

    Código original

    void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
            {
                mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)this.webBrowser1.Document;

                foreach (IHTMLElement link in doc.links)
                {
                    HTMLAnchorElement anchor = link as HTMLAnchorElement;
                    if (anchor != null)
                    {
                        HTMLAnchorEvents_Event handler = anchor as HTMLAnchorEvents_Event;
                        if (handler != null)
                        {
                            handler.onclick += new HTMLAnchorEvents_onclickEventHandler(delegate()
                            {
                                MessageBox.Show("You clicks the link: " + anchor.href);
                                return true;
                            });
                        }
                    }
                }
            }

    Convertido

    Dim doc As mshtml.HTMLDocumentClass = DirectCast(WebBrowser1.Document, mshtml.HTMLDocumentClass)

    En la primer línea ya me muestra el error Un valor de tipo 'System.Windows.Forms.HtmlDocument' no se puede convertir en 'mshtml.HTMLDocumentClass'.

           For Each link As IHtmlElement In doc.links

                Dim anchor As HTMLAnchorElement = TryCast(link, HTMLAnchorElement)

                If anchor IsNot Nothing Then

                    Dim handler As HTMLAnchorEvents_Event = TryCast(anchor, HTMLAnchorEvents_Event)
                    If handler IsNot Nothing Then
    handler.onclick += New HTMLAnchorEvents_onclickEventHandler(Function() Do    

    'Public Event onclick() As Boolean' es un evento y no se puede llamar directamente. Utilice la instrucción RaiseEvent para provocar un evento.

                        AddHandler handler.onclick, AddressOf myprocedimiento anchor.href
                        Return True
    End Function)
    End If
    End If
    Next

    El código pretende asignar a los hipervinculos de un documento cargado en un webbrowser, eventos a cada uno de los mismos, para que cuando al cliquear en ellos pueda ejecutar un procedimiento que posee como argumento el nombre del link.

    Muchas gracias!

    • Cambiado Enrique M. Montejo sábado, 23 de junio de 2012 14:09 controles de Windows Forms (De:Lenguaje VB.NET)
    sábado, 14 de abril de 2012 12:35

Todas las respuestas

  • A mi también me dan los mismos errores (y no termino de entender el porqué), pero dando una vuelta por google encontré este artículo que puede que te ayude

    http://www.codeproject.com/Articles/19407/HTML-Parsing-using-NET-Framework


    Atentamente, Sergio.

    Blog
    Twitter

    sábado, 14 de abril de 2012 12:49
  • hola

    que version de .net estas usando ?

    porque hace poco sucedio algo paracido y determinamos que esta definicion solo funciona si usas .net 4, con cualquier otra version en vb.net no funciona esa notacion

    AddHandler handler.onclick, AddressOf ClickLink
    
    y luego defines por fuera de este evento
    
    Public Sub ClickLink()
    
        MessageBox.Show("You clicks the link")
        Return True
    
    End Sub

    si se que no esta el link pero prueba primero si de esta forma da resultado y muestra el mensaje

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    sábado, 14 de abril de 2012 12:56
  • Gracias Sergio, pero la principal complejidad es asociar un procedimiento o función al evento onclick de cada link. Encontré estos enlaces, quizás estés más ducho y puedas resolverlo!

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/e59b3e72-9f5d-4a09-a0b5-9088573cb965/

    http://social.msdn.microsoft.com/Forums/es/vbes/thread/9cbe0c24-420c-45d0-ae39-40177a7e44bc

    De todas formas lo que necesito es capturar el nombre del link en el cual se hace clic y ejecutar un procedimiento o función, si existe o conoces otra forma ya de antemano mil gracias!

    sábado, 14 de abril de 2012 12:56
  • Entonces puede ser eso Leandro!, net 2.0!

    Y que solución puedo encontrar para conseguir lo que busco?, obtener el enlace en el cual se realiza clic y ejecutar un procedimiento que lleva como parametro el nombre del mismo?

    Saludos!

    sábado, 14 de abril de 2012 13:02
  • intenta definiendo el metodo que adjuntas al click de forma separada, como puse en el ejemplo

    despues iremos viendo de agregar funcionaldiad, pero vamos por pasos

    esta claro que con .net 2 esa notacion que tiene el ejemplo no funcionara, no digo que el ejemplo sea incorrecto, sino que usa una version mucho mas actual de .net, pero si se puede tomar la idea y adaptar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 14 de abril de 2012 13:13
  • No funciona hasta el momento, pego como lo tengo armado, modifique un poco la función porque necesitaba retornar un valor!

    For Each link As mshtml.IHTMLElement In doc.links
                Dim anchor As mshtml.HTMLAnchorElement = TryCast(link, mshtml.HTMLAnchorElement)
                If anchor IsNot Nothing Then
                    Dim handler As mshtml.HTMLAnchorEvents_Event = TryCast(anchor, mshtml.HTMLAnchorEvents_Event)
                    If handler IsNot Nothing Then
                          AddHandler handler.onclick, AddressOf ClickLink
                    End If
                End If
            Next

    Public Function ClickLink() As Boolean
            MessageBox.Show("You clicks the link")
            Return True
        End Function

    Otra cosa, por qué puede ser que el primer directcast no funcione?

    sábado, 14 de abril de 2012 13:13
  • per la ejecucion llega a la linea

     AddHandler handler.onclick, AddressOf ClickLink

    o el problema es anterior ?

    cual primer DirectCast es que no funciona? y cual es le mensaje de error obtienes

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 14 de abril de 2012 13:16
  • Este es el error inicial!

    Dim doc As mshtml.HTMLDocumentClass = DirectCast(WebBrowser1.Document, mshtml.HTMLDocumentClass)

    En la primer línea ya me muestra el error Un valor de tipo 'System.Windows.Forms.HtmlDocument' no se puede convertir en 'mshtml.HTMLDocumentClass'.

    No llega hasta la línea como planteabas, pude arrastrarse el error desde el comienzo entonces!

    sábado, 14 de abril de 2012 13:28
  • Efectivamente es el mismo error que me daba a mi, por eso te plantee el otro código. A mi no me daba el error el error del click porque estoy en .NET 4...

    Atentamente, Sergio.

    Blog
    Twitter


    • Editado sergiomf sábado, 14 de abril de 2012 13:31
    sábado, 14 de abril de 2012 13:30
  • Yo pude continuar declarando la variable de otro tipo, pero obviamente no consigo el mismo resultado!

    Dim doc As mshtml.IHTMLDocument
    doc = WebBrowser1.Document

    sábado, 14 de abril de 2012 13:32
  • y si usas

    Dim doc As HTMLDocument = DirectCast(WebBrowser1.Document, HTMLDocument)

    en definitiva este tambien tiene la propiedad links



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 14 de abril de 2012 16:03
  • Luego de intentar repetidas veces, he logrado verificar lo siguiente:

    Con el siguiente código:

            For Each link As mshtml.IHTMLElement In doc.Links
                Dim anchor As mshtml.HTMLAnchorElement = TryCast(link, mshtml.HTMLAnchorElement)
                If anchor IsNot Nothing Then
                    Dim handler As mshtml.HTMLAnchorEvents_Event = TryCast(anchor, mshtml.HTMLAnchorEvents_Event)
                    If handler IsNot Nothing Then
                        AddHandler handler.onclick, AddressOf ClickLink
                    End If
                End If
            Next

    El For Each se detiene en la primer linea, sin mostrar error alguno, en la depuración ni siquiera pasa por el Next, sin embargo el número de links es el correcto, se corta abruptamente el procedimiento.

    Con este otro código:

    For i As Integer = 0 To doc.Links.Count - 1
                Dim anchor As mshtml.HTMLAnchorElement = TryCast(doc.Links(i), mshtml.HTMLAnchorElement)
                If anchor IsNot Nothing Then
                    Dim handler As mshtml.HTMLAnchorEvents_Event = TryCast(anchor, mshtml.HTMLAnchorEvents_Event)
                    If handler IsNot Nothing Then
                        AddHandler handler.onclick, AddressOf ClickLink
                    End If
                End If
            Next

    El bucle se ejecuta la cantidad de veces en forma correcta, pero la conversión TryCast(doc.Links(i), mshtml.HTMLAnchorElement)siempre devuelve Nothing, en consecuencia el If de abajo que posee la instrucción  AddHandler handler.onclick, AddressOf ClickLink nunca se ejecuta.

    Gracias a todos por la ayuda!


    • Editado julian_mdq domingo, 15 de abril de 2012 12:17
    sábado, 14 de abril de 2012 20:03