ObjectListView Visual Basic .NET

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:

Al hacer click en una celda con un enlace web, se abren varias instancias del navegador

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
	

….

Leave a Reply

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.