Un control extraordinario para desarrollar aplicaciones en .Net es ObjectListView, una versión ampliada, mejorada y con muchas más funcionalidades y características que el usual ListView.
La página del control: http://objectlistview.sourceforge.net/cs/index.html
La mayoría de la documentación está para el lenguje C#, por eso, iré poniendo en esta entrada las dificultades y soluciones que he ido encontrando para adaptar y usar en Visual Basic .NET
Antes de empezar
La versión disponible para la descarga, tanto en Nuget como en la página del proyecto en SourceForge es la 2.9.1, de 2016, que tiene algunos bugs.
Por eso, lo imprescindible, es descargarse el código fuente https://sourceforge.net/p/objectlistview/code/HEAD/tree/, que es más reciente (de 2018) y que corrige bugs importantes. Se descarga la rama trunk completa (que incluye proyectos para Visual Studio 2005, 2008 y 2012, este último es el que he usado) y se compila en Visual Studio, obteniendo así la dll actualizada para usar.
El proyecto de VS2005 puede compilarse sin ningún problema en SharpDevelop (https://sourceforge.net/projects/sharpdevelop/), en concreto en la versión 4.4, que es la que soporta Visual Basic .NET
Una vez tenemos nuestra versión ObjectListView.dll, simplemente seguimos las instrucciones para incorporarla a nuestro proyecto/solución
Evento CellClick, abrir una página web con la url de la celda seleccionada
Resulta que si uno hace lo habitual para abrir un enlace web en una celda, se abren varias instancias del navegador Web con ese enlace. Esto es un bug o problema reconocido, y en los foros de ObjectListView esta la solución para C#. La adaptación a Visual Basic se pone aquí.
Problema: Cellclick creates MANY Instances , ayuda MSDN Control.BeginInvoke Método
Ejemplo del problema:
El código fuente «normal» para el evento CellClick , pero que produce el indeseado efecto de abrir varias veces el enlace, sería el siguiente
Nota: uso un FastDataListView que carga una tabla de una base de datos, por eso incluye un test para comprobar si el dato es nulo, pero vale para cualquiera de los ObjectListView disponibles.
Sub FastDataListView1CellClick(sender As Object, e As BrightIdeasSoftware.CellClickEventArgs) Dim s As String If IsDBNull(e.SubItem.ModelValue) Then Exit Sub s = e.SubItem.ModelValue If Strings.Left(s,7) = "http://" Then abrirWeb(s) End If End Sub Sub abrirWeb(url As String) System.Diagnostics.Process.Start(url) End Sub
El código que resuelve el problema, es el siguiente, teniendo en cuenta la ayuda indicada en los dos links anteriores, usando BeginInvoke y una función delegada
Delegate Sub myDelegate(s As String) Sub FastDataListView1CellClick(sender As Object, e As BrightIdeasSoftware.CellClickEventArgs) Dim s As String If IsDBNull(e.SubItem.ModelValue) Then Exit Sub s = e.SubItem.ModelValue If Strings.Left(s,7) = "http://" Then fastDataListView1.BeginInvoke(New myDelegate(AddressOf abrirWeb),s) End If End Sub Sub abrirWeb(url As String) System.Diagnostics.Process.Start(url) End Sub
….