Browsing articles in "VB.NET"
mar 19, 2010

VB.NET Quick Reference

Os dejo una guía rápida de VB.NET bastante útil. Os la podéis descargar en PDF desde este link.

VB.NET Quick Reference

A vueltas con .NET: ComboBox Multi-Columna

Aunque parezca mentira Visual Basic 2008 no incorpora por defecto un ComboBox capaz de mostrar varias columnas de datos. La única manera de hacerlo es programarlo nosotros mismos o buscar ese control por Internet.

Como ya os imaginais a estas alturas, no vamos a inventar nada que ya esté inventado y funcione perfectamente. Por tanto, vamos a añadir el control capaz de hacer lo que queremos y explicar cómo utilizarlo para mostrar los datos que nos interese. En nuestro caso vamos a utilizar el control Icon ComboBox, creado por Steve McMahon, de la conocida página vbaccelerator

iconcombobox

¿Cómo añadir el control a nuestro proyecto?

Lo primero será descargar el control.

Una vez descargado tenemos que añadir el control al toolbox de nuestro proyecto. Clickando con el botón derecho del ratón encima del toolbox marcamos “Choose Items“, dentro del nuevo menú le damos a Browse y seleccionamos el archivo .dll del control.

Llegados a éste punto tenemos el nuevo control añadido al toolbox y listo para usarse. Lo siguiente será añadir el control al formulario, declararlo, modificar los aspectos visuales y empezar a pasarle valores. Vamos a ello.

Añadir el control al formulario se hace igual que cualquier otro control de los que vienen por defecte en Visual Studio, por tanto arrastramos el control al formulario y empezamos a trabajar con él.

Declaramos el control. Como veis se trata de definir cuántas columnas va a tener el control y el espacio que van a ocupar:


Dim column As IconComboBoxColumn = New IconComboBoxColumn

'Por defecto el control ya trae una columna, sólo cambiamos su tamaño
IconComboDepartamento.Columns(0).ColumnWidth = 128

'Segunda columna
column.ColumnWidth = 32
IconComboDepartamento.Columns.Add(column)

'Tercera columna

column = New IconComboBoxColumn
column.ColumnWidth = 96
IconComboDepartamento.Columns.Add(column)

Ya tenemos el control declarado, ahora solo falta poblarlo y mostrarlo. El método para poblar el control consiste en añadirle Items, cada item es una linea del combobox y a cada item le añadiremos tantos subitems como columnas tengamos en el control. Con el ejemplo queda más claro.


Dim ici As IconComboItem = New IconComboItem
ici.Text = "Informática"

Dim subitem As IconComboSubItem = New IconComboSubItem
subitem.Text = "5 trabajadores"
ici.SubItems.Add(subitem)

subitem = New IconComboSubItem
subitem.Text = "Piso superior"
ici.SubItems.Add(subitem)

IconComboDepartamento.Items.Add(ici)

De éste manera hemos añadido una linea al combobox de 3 columnas.

A vueltas con .NET: Modificar Connection Strings en Runtime

Esto del .NET me parece alucinante, la de cosas que se pueden llegar a hacer de forma rápida y sencilla es enorme. Sin hablar de la cantidad ingente de ejemplos y ayuda que podemos encontrar por Internet. Sin embargo, me he encontrado con un problema.

En una aplicación que estoy haciendo necesito poder leer los datos de diferentes bases de datos en función del dominio en el que se ha autentificado el usuario. Las bases de datos corresponden a diferentes fábricas alrededor del mundo así que necesito poder cambiar el ConnectionString que utilizan los DataSets en tiempo de ejecución.  Después de indagar ésto es lo que he conseguido, espero que alguien le ayude.

Lo primero que debemos hacer es declarar los diferentes ConnectionString que podemos utilizar, en nuestro caso lo haremos dentro de  My Project -> Settings.

mysettings

En mi caso tengo 3 Connection Strings, uno de ellos (ConnectionString) es el que utilizan los diferentes DataSets y los otros dos (SpainConnectionString y ChinaConnectionString) son los diferentes valores que puede tomar la primera variable. En la misma pantalla de Settings le damos a ViewCode y saltaremos al código de la clase Settings  que nos permite utilizar eventos específicos de esa clase.


Namespace My
'This class allows you to handle specific events on the settings class:
' The SettingChanging event is raised before a setting's value is changed.
' The PropertyChanged event is raised after a setting's value is changed.
' The SettingsLoaded event is raised after the setting values are loaded.
' The SettingsSaving event is raised before the setting values are saved.
Partial Friend NotInheritable Class MySettings
Public WriteOnly Property ChangeConnectionString() As String
Set(ByVal Value As String)
My.Settings("ConnectionString") = Value
End Set
End Property
End Class
End Namespace

Éste es el código que modifica el valor de la variable ConnectionString (también se puede utilizar para cambiar culaquier valor de la clase My Setting), ahora debemos llamar a éste proceso con el valor que nos interese.

En nuestro caso miramos el dominio del usuario y el rango de IP’s del usuario.

Private Sub GetDomain(ByVal HostName As String)
'Buscamos el dominio al que corresponde la ip que tenemos asignada,
'no el dominio al que nos hemos
'logueado desde Windows
Dim Direcciones As IPAddress() = Dns.GetHostAddresses(HostName)
'Recorremos todos los posibles dominios y cargamos el portal del dominio correspondiente
Select Case Mid(Mid(Direcciones(0).ToString(), 9), 1, InStr(Mid(Direcciones(0).ToString(), 9), ".") - 1)
Case My.Settings.SPAIN_IP
My.Settings.ChangeConnectionString = My.Settings.SPAINConnectionString
Case My.Settings.CHINA_IP
My.Settings.ChangeConnectionString = My.Settings.CHINAConnectionString
Case Else
'Si llegamos aqui es que no estamos en ningun dominio conocido, por tanto cerramos el portal
End Select
End Sub

Espero que os sea de ayuda.

A vueltas con .NET: Minimizar formulario en la barra de tareas

Desde hace algún algo más de un mes estoy aprendiendo a programar con en .Net con Visual Basic 2008. Lo estoy haciendo totalmente auto-didacta así que hasta dentro de un tiempo no habrá gran cosa… Se me ha ocurrido colgar todas las dudas que me asalten y encuentre su solución en “El Interné”, por si a alguien le puede servir de ayuda.

El caso de hoy trata de minimizar nuestro formulario y colocarlo en la barra de tareas de Windows (System Tray), no es gran cosa pero es un comienzo, no? :)

Lo que debemos hacer es añadir un NotifyIcon a nuestro formulario y, si queremos que quede más bonito, añadirle un ContextMenu. La finalidad de éste control es crear un menú cuando hagamos click encima del NotifyIcon. Añadimos el siguiente codigo al evente de cerrar del formulario que queremos ocultar.


'En lugar de cerrar el programa lo vamos esconder y mostrar el icono del IconTray

Private Sub frmPortal_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

'Primero lo minimizamos

Me.WindowState = FormWindowState.Minimized

Me.ShowInTaskbar = True

'Ahora lo hacemos invisible y cancelamos el evento de cerrar

Me.Visible = False

e.Cancel = True

End Sub

Hasta ahora lo que hemos echo es esconder el formulario pero todavia no veremos ningún icono en la barra de tareas.

En mi caso no voy a usar un ContextMenu,lo que me interesa es que cuando se haga click encima del NotifyIcon el formulario vuelva a aparecer.


'Hacer click en el icono significa volver a abrir la aplicacion

Private Sub NotifyIcon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon.Click

'Primero lo maximizamos

Me.WindowState = FormWindowState.Maximized

'Refrescamos los controles del formulario, sólo por nitidez.

Me.Refresh()

'Lo volvemos a hacer visible

Me.Visible = True

Me.BringToFront()

End Sub

Llegados a este punto me encontré con un problema, si tenía mas ventanas abiertas el formulario aparecía detrás de todas ellas. Teniendo en cuenta que es un aplicación que me interesa que esté siempre delante del todo utilizé la propiedad TopMost del formulario.