miércoles, 30 de diciembre de 2009

Propósitos para el 2010

Pues eso, a falta de horas para que acabe el año se me ha dado por hacer una lista de los propósitos para el 2010, a ver si consigo cumplir con alguno :P

- Ser bueno ... no, voy a seguir siendo malo que es más divertido :D

- Acabar alguno de los 2 libros que tengo sobre Arquitectura de aplicaciones en .NET

- Probar la beta 2 del Visual Studio 2010, a ver si este cambio de versión no me pilla el toro :P

- Sacarme el MCPD Enterprise Application Developer 3.5 on Visual Studio 2008, que aún me quedan 4 exámenes.

- Aprobar entre 4 y 6 asignaturas de la carrera.

- Viajar, conocer gente interesante y disfrutar de la vida :D


Pero para todo eso necesito dormir 2 horas o que los días tengan unas 30 o 36 horas ... más :P

FELIZ AÑO A TOD@S ;)

viernes, 18 de diciembre de 2009

Establecer propiedades del IDE de Visual Studio dependiendo del proyecto que se abre

En el proyecto en el que estoy trabajando tenemos en el Team Foundation un branch con la solución de desarrollo y otro con la misma solución de producción. Considero que es una buena práctica que evita subir código no probado a producción y por ahora nos está llendo bastante bien.

El "problema" es que a veces tenemos que tener ambas soluciones abiertas a la vez, y como los cambios que tienen suelen ser muy pequeños, hay que tener mucho cuidado para no meter la pata y no modificar el código en el branch que no toca.

Comentándolo con mi compañero Pere, se me ocurrió que estaría bien tener un IDE diferente para cada una de las soluciones, algo sencillo, como cambiar el color de fondo o el tipo de letra. Y nos pusimos a buscar cómo hacerlo, gracias a San Google encontramos rápido la solución:

En este post: http://geekswithblogs.net/sdorman/archive/2007/04/25/111981.aspx

se explican 2 formas de hacerlo, una con macros que a mí me pareció un poco complicada y otra bastante más sencilla ejecutando el Visual Studio desde línea de comandos.

Los pasos que hay que seguir:

1 - En el menú Tools - Options dentro Environment - Fonts and Colors, establecemos el tipo de letra y los colores que queramos para, por ejemplo, la solución de desarrollo.

2 - Exportamos los settings desde el menú Tools - Import and Export Settings...

3 - Seleccionamos la opción Export selected enviromment settings, marcamos todos los settings y seleccionamos una ruta para guardar el fichero, por ejemplo: "C:\VSSettings\Desarrollo.vssettings"

Repetimos los pasos con un fondo distinto o un tipo de letra diferente y lo guardamos en "C:\VSSettings\Produccion.vssettings"

4 - Creamos un acceso directo en el escritorio, en el destino seleccionamos el fichero devenv.exe que es el que lanza el Visual Studio (generalmente está en C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE).

5 - Abrimos las propiedades del acceso directo y cambiamos el destino por:

devenv.exe "C:\Mi_Solucion_Desarrollo\MiSolucion.sln" /resetsettings "C:\Vssettings\desarrollo.vssettings"

6 - Creamos otro acceso directo como en el paso 4.

7- Cambimos el destino por:

devenv.exe "C:\Mi_Solucion_Produccion\MiSolucion.sln" /resetsettings "C:\Vssettings\Produccion.vssettings"


Y listo, ya tenemos un acceso directo para que nos abra cada solución con una configuración del IDE de Visual Studio diferente.

Lo cierto es que tarda un poco más en iniciarse ya que tiene que cargar la configuración pero creo que nos evitará muchos dolores de cabeza :)


Happy codding ;)

miércoles, 9 de diciembre de 2009

Imprimir el contenido de un DataGridView con PrintDocument (en VB.NET)

Dada la cantidad de comentarios (más de 10 :P) que se produjeron en el post en el que explicaba como imprimir el contenido de un datagrid, me veo en la obligación a hacer el mismo ejemplo en VB.NET, sobre todo porque el código que puse en los comentarios tenía algún error.

Recordando el ejemplo, se trata de un formulario que contiene:
- un datagrid llamado DataGridView1
- un botón llamado Button1
- un PrintDocument llamado PrintDocument1

Y aquí tenéis el código:



Public Class Form1

' Variable a nivel de clase para recordar en qué punto nos hemos quedado
Dim i As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Fill_DataGrid()
End Sub

Private Sub Fill_DataGrid()

' TODO: rellenar con el código que obtiene los datos de donde sea necesario
' Por ejemplo:

Me.DataGridView1.DataSource = dataSet
Me.DataGridView1.DataMember = "Table"
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.PrintDocument1.Print()
End Sub

Private Sub printDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
' Definimos la fuente que vamos a usar para imprimir
' en este caso Arial de 10
Dim printFont As System.Drawing.Font = New Font("Arial", 10)
Dim topMargin As Double = e.MarginBounds.Top
Dim yPos As Double = 0
Dim linesPerPage As Double = 0
Dim count As Integer = 0
Dim texto As String = ""
Dim row As System.Windows.Forms.DataGridViewRow

' Calculamos el número de líneas que caben en cada página
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)

' Imprimimos las cabeceras
Dim header As DataGridViewHeaderCell
For Each column As DataGridViewColumn In DataGridView1.Columns
header = column.HeaderCell
texto += vbTab + header.FormattedValue.ToString()
Next

yPos = topMargin + (count * printFont.GetHeight(e.Graphics))
e.Graphics.DrawString(texto, printFont, System.Drawing.Brushes.Black, 10, yPos)
' Dejamos una línea de separación
count += 2

' Recorremos las filas del DataGridView hasta que llegemos
' a las líneas que nos caben en cada página o al final del grid.
While count < linesPerPage AndAlso i < DataGridView1.Rows.Count
row = DataGridView1.Rows(i)
texto = ""
For Each celda As System.Windows.Forms.DataGridViewCell In row.Cells
'Comprobamos que la celda tenga algún valor, en caso de
'permitir añadir filas esto es muy importante
If celda.Value IsNot Nothing Then
texto += vbTab + celda.Value.ToString()
End If
Next

' Calculamos la posición en la que se escribe la línea
yPos = topMargin + (count * printFont.GetHeight(e.Graphics))

' Escribimos la línea con el objeto Graphics
e.Graphics.DrawString(texto, printFont, System.Drawing.Brushes.Black, 10, yPos)
' Incrementamos los contadores
count += 1
i += 1
End While

' Una vez fuera del bucle comprobamos si nos quedan más filas
' por imprimir, si quedan saldrán en la siguente página
If i < DataGridView1.Rows.Count Then
e.HasMorePages = True
Else
' si llegamos al final, se establece HasMorePages a
' false para que se acabe la impresión
e.HasMorePages = False
' Es necesario poner el contador a 0 porque, por ejemplo si se hace
' una impresión desde PrintPreviewDialog, se vuelve disparar este
' evento como si fuese la primera vez, y si i está con el valor de la
' última fila del grid no se imprime nada
i = 0
End If
End Sub

End Class




Happy coding ;)