Tuesday, November 29, 2011

Formatear una columna De Un gridview / datagridview

Frase del día: "No elegimos de quien enamorarnos y jamás pasa como debería."

Por ejemplo, si querés que el dato de x columna se muestre sólo la hora...



para el control DataGridView (Windows Form) el código va así:

Me.dgvServicio2.Columns(22).DefaultCellStyle.Format = "HH:mm"

para el control GridView (Web Form) el código va así:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            e.Row.Cells(0).Text = CDate(e.Row.Cells(0).Text).ToString("HH:mm")
        End If
    End Sub

Más sencillo para windows form, no?

Pero en el caso de que tu GridView tenga deshabilitada la opción Autogeneración de Campos, en la parte donde le agregas las columnas podes formatearla:



HaPPy CoDiNg =)

Thursday, November 24, 2011

Gizmox - visual webgui

Visual WebGui es una herramienta creada por Gizmox. Gizmox funciona con el desarrollo .Net de Microsoft.

Visual WebGui es una aplicación que funciona sobre un sevidor de Internet usando software de virtualización y una capa de código que hace que su interfaz funcione en el moderno estándar para Web HTML5.

Practicamente es como desarrollar aplicaciones Windows y verlas como aplicaciones Web.

Windows con cara de Web o Web pero Windows.

Checka esto. Es una ventana dialog/popup. Lo desarrollé así:


Pero se lo ve así:


Y como funciona con Visual Studio, al agregar un nuevo proyecto (claro, después de instalar el gizmox) te aparecerá la siguiente venanta:


Más Info, su Web Oficial: http://www.visualwebgui.com/

Pero como todo, tiene sus ventajas y desventajas. Lo que me agrada es que te ahorra tiempo en el diseño de los formularios. Como que más te dedicás al código de programación y cero diseño. Oh vaya! Me acabo de dar cuenta. Con esto, ya no necesitaríamos contratar un Web Designer jajajajajajaj

Monday, November 21, 2011

Cómo cargar Un treeview windows form

Treeview. There is no treenode value property. VB.NET (System.Windows.Forms)

No es cierto que cuando poblamos un treeview de ASP.NET, utilizamos las propiedades Node.Text y Node.Value El text es lo que se muestra y el value es para trabajar por abajo, mas que todo para los queries es útil.

Pero resulta que el TreeView de los Controles Windows no tiene esa propiedad. Y si queremos hacer un insert a una x tabla a partir del treeview, estariamos en un conflicto.

Yo suelo utilizar la famosa property "tag". Esta propiedad recibe un objeto. Yo la trabajo así:

Public Sub proCargarArbol()
        Dim idServicio As Integer = Me.lsvServicios.SelectedItem.Text
        Dim objRutas As New clsTarifaServicio
        Dim dtServicio2 As DataTable = objRutas.getServicio2
        TreeView1.BeginUpdate()
        TreeView1.Nodes.Clear()
        Dim index As Integer = 0
        For Each dr As DataRow In dtServicio2.Rows
            Dim NewNode As New TreeNode
            NewNode.Text = dr(1).ToString
            NewNode.Tag = dr
            Me.TreeView1.Nodes.Add(NewNode)
            Dim dtRutas As DataTable = objRutas.getRutas(idServicio, dr(0))
            For Each row As DataRow In dtRutas.Rows
                Dim NewNodeSon As New TreeNode
                NewNodeSon.Text = row(2).ToString + " - " + row(4).ToString
                NewNodeSon.Tag = row
                Me.TreeView1.Nodes(index).Nodes.Add(NewNodeSon)
            Next
            index = index + 1
        Next
        TreeView1.EndUpdate()
    End Sub

Checkan? Al tag le estoy mandando una fila con los datos importantes de ese item que lo cargué en el árbol. Y bueno, cuando necesiten extraer esa info, solo le hacen un for each al árbol, se crean un datarow y se lo asigan el tag.

HaPPy Coding =)

Friday, November 18, 2011

Habilitar menú programador excel 2010

Para habilitar el menú programador en Excel 2010



Clic en Archivo que está situado en la parte izquierda superior de la ventana, luego clic en Opciones.


Se te abrirá la siguiente ventana.


Clic en Personalizar cinta de opciones, y en la parte derecha debajo de Fichas principales, tickea la opción Programador y clic en Aceptar. Listo!

Thursday, November 17, 2011

Cargar Un dropdownlist Con Un archivo XML

Si alguna vez quisieras cargar un combo como fuente de datos una hoja XML, hacerlo es sencillo.

Primero, te creas tu archivo XML. En un proyecto WEB, los archivos XML y otros de datos, se guardan en el directorio App_Data. Tal como se muestra en la siguiente imagen, te agregas un archivo XML.


Luego, empezas a editarlo, en este caso para el ejemplo voy a cargar un combo con una lista de países.


En el aspx de tu página, te jalas un control DropDownList y empezas a editarlo.



        


Checka que tiene un DataSourceID, para ello, te jalas un XmlDataSource y lo editas, que quede así:



El ID que le pongas al XmlDataSource se lo pasas al DropDownList a su atributo DataSourceID.

Luego ejecutas tu proyecto, y directamente verás tu combo cargado.

Si no querés que por defecto se cargue, entonces no uses el XmlDataSource. Hazlo por código. Así:


Public Sub prcCargarComboPaises()
        Dim ds As New DataSet
        ds.ReadXml(Server.MapPath("~/App_Data/Paises.xml"))
        Me.DropDownList2.DataSource = ds
        Me.DropDownList2.DataValueField = "abbrev"
        Me.DropDownList2.DataTextField = "name"
        Me.DropDownList2.DataBind()
    End Sub

Para bindear un GridView con un archivo XML es casi lo mismo! Checka:

Public Sub prcCargarGridViewPaises()
        Dim ds As New DataSet
        ds.ReadXml(Server.MapPath("~/App_Data/Paises.xml"))
        grvPaises.DataSource = ds
        grvPaises.DataBind()
    End Sub

HaPPy CoDiNg =)

Thursday, November 10, 2011

Iniciando con Log4net

En el software development, el escribir una bitácora de todo lo que pasa en el sistema es una buena práctica. ¿Por qué? Porque podrían ocurrir errores no controlados que son difíciles de rastrear. Por ello, atrapar el error y registrar lo que sucedió es una info muy preciada más todavía cuando ya se está en entorno de producción.

Log4net nos brinda esa solución.

Log4Net es un framework portado de la librería log4java, el cual te ofrece todas las herramientas posibles para poder hacer un logging, control de errores, monitorización de aplicaciones para todas tus aplicaciones posibles. Log4net es un producto gratuito ofrecido por Apache. http://logging.apache.org/log4net/index.html

LEVELS

Log4NET ofrece distintos niveles de monitorización predefinidos como son:

1. Debug: Se utiliza para líneas de debug.
2. Info: Se utiliza para dar información relativa de nuestra aplicación.
3. Warn: Son posibles puntos de ruptura de nuestro software: posibles alertas importantes.
4. Error: Se utiliza para detectar errores de nuestro software.
5. Fatal: Se utiliza para detectar posibles errores importantes de software, es decir, que impidan el funcionamiento del mismo por ejemplo.

APPENDERS

Es el modo en que los distintos niveles del log4net van a ser monitorizados/logeados, en log4net existen estos entre otros:

1. FileAppender: Logea el nivel definido en la configuración en fichero.
2. RollingFileAppender: Logea el nivel definido en la configuración en un fichero que va rotando dependiendo de su peso.
3. SmtpAppender: Logea el nivel definido en la configuracion y es enviado a un destinatario de correo.
4. ConsoleAppender: Usualmente es para testing pero funciona también en production. Escribe en el output window o en el command window si estás usando console application.
5. AdoNetAppender.

Para poner en marcha Log4net en tu aplicación necesitamos 3 elementos básicamente: la Configuración, el Setup y el Call.

Un Ejemplo Básico

Primero, debés bajarte la DLL de log4net. La podés bajar desde aqui
http://www.4shared.com/file/C37E3-aG/log4net.html

Contraseña: princesita

Luego lo agregas a tu proyecto.

Ahora, necesitamos configurar el web.config (app.config si tu aplicación es windows) Una configuración con lo suficiente sería la siguiente:



Como appender, estoy utilizando el RollingFileAppender. Creo que es el preferido.
En la etiqueta File debes colocar dónde se guardará el log.
conversionpattern es cómo se escribirá el texto del log, es decir, el formato.

En la clase donde utilizarás el logger, debes crearte un objeto de tipo ILog. Construirlo y empezar a llamarlo desde los lugares que desees. Checka el ejemplo, dentro de la función que me ejecuta un Select, voy a llamar al logger para registrar un ERROR. A propósito, le envío un SELECT con error para que se pueda registrar en el log.

Imports System.Data.SqlClient
Imports System.Text
Imports System.Configuration
Imports log4net

Public Class clsDataBase
Private strConn As String
Private log As ILog

Public Sub New()
strConn = ConfigurationManager.ConnectionStrings("CadenaDeConexion").ConnectionString
log = LogManager.GetLogger("lmendivil")
log4net.Config.XmlConfigurator.Configure()
End Sub

Public Function fncConsultar(ByVal strSQL As String) As DataTable
Dim objConn As New SqlConnection(strConn)
Dim objComm As New SqlCommand(strSQL, objConn)
Dim objAdap As New SqlDataAdapter(objComm)
Dim ds As New DataSet
Try
objConn.Open()
objAdap.Fill(ds)
Return ds.Tables(0)
Catch ex As Exception
log.Error(Me.getErrorSQL(strSQL), ex)
Throw New Exception(ex.Message)
Finally
objConn.Close()
End Try

End Function

Public Function getErrorSQL(ByVal sql As String) As String
Dim strErrorSQL As New stringbuilder
strErrorSQL.AppendFormat("SQL: {0}", sql)
strErrorSQL.AppendLine()
Return strErrorSQL.ToString
End Function
End Class


Así es como se puede leer en el archivo bitacora.log


La línea roja que pinté está mostrando el FORMATO que previamente configuré en el web.config dentro de la etiqueta "conversionpattern", lo recuerdas? Checka que estoy mostrando:
LA FECHA, LA HORA, EL LEVEL, EL LOGGER, EL MÉTODO DESDE DONDE SE HACE EL LLAMADO, Y EL MENSAJSE

HaPPy LoGGinG =)

Tuesday, November 8, 2011

List Of a datatable

Cómo convertir una lista genérica de objetos a una datatable. vb.NET. ASP.NET

Lo cierto es que este tema me ha interesado, aquí te va un poco más de Reflection. Por si alguna vez precisas realizar una conversión de un List Of Tu Clase a un DataTable.

Nota.- La clase a utilizar en este ejemplo, es la clase Persona, la misma que se utilizó en el post anterior.

Primero, agrego mis objetos de tipo Persona a mi List Of. Luego que la lista está llenada, la traspaso a un datatable. Recorro las propiedades de mi clase para que los nombres de éstas sean los nombres de las columnas del datatable. Acto seguido, por cada ítem de la lista, recorro cada propiedad para agregar cada valor como fila del datatable. Bueno, lo demás ya es obvio.

Imports System.Collections.Generic
Imports System.Data
Imports System.Reflection
Imports ClassLibrary3

Partial Class _Default
    Inherits System.Web.UI.Page


    Private lstPersonas As New List(Of clsPersona)

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.prcCrearPersona()
        Dim dt As DataTable = ConvertToDataTable(lstPersonas)
    End Sub

    Private objPersona As clsPersona

    Public Sub prcCrearPersona()
        For i As Integer = 0 To 4
            objPersona = New clsPersona
            objPersona.pNombre = "Lizzy" & i
            objPersona.pApellido = "Mendivil" & i
            Me.lstPersonas.Add(objPersona)
        Next
    End Sub

    Public Shared Function ConvertToDataTable(Of T)(ByVal list As IList(Of T)) As DataTable
        Dim dt As New DataTable()
        Dim propiedades As PropertyInfo() = GetType(T).GetProperties
        For Each p As PropertyInfo In propiedades
            dt.Columns.Add(p.Name, p.PropertyType)
        Next
        For Each item As T In list
            Dim row As DataRow = dt.NewRow
            For Each p As PropertyInfo In propiedades
                row(p.Name) = p.GetValue(item, Nothing)
            Next
            dt.Rows.Add(row)
        Next
        Return dt
    End Function

End Class


Como resultado, tendrías que tener una vista similar a esta: (claro, según tu clase)


HaPPy Coding =)

Monday, November 7, 2011

System.reflection


Qué es Reflection? Para qué sirve? En qué me es útil? Cuándo usar? Bueno, si te has hecho estas preguntas vas bien, yo también me las hice, jejeje.

Empezemos por la definición:

Reflection proporciona objetos (de tipo Type) que encapsulan ensamblados, módulos y tipos. Se puede utilizar la reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo a partir de un objeto existente, e invocar sus métodos o tener acceso a sus campos y propiedades.

Reflection es una “tecnica” para poder extraer la metadata de nuestras estructuras de datos dentro de una assembly.

Reflection es la habilidad que tiene un código para revisar su propia estructura, es decir, podemos revisar la metadata que está en el assembly y manipularla a nuestro antojo.

Utilidades

Nos ayuda a consultar qué propiedades o métodos tiene un objeto en TIEMPO DE EJECUCIÓN.

Podemos diseñar un formulario dinámicamente.

Empezando a utilizar Reflection. HowTo

Hay dos formas: usando typeof() o GetType(). Ambas formas retornan un objeto tipo Type, ese es el que nos otorga a información que queremos.

Entre los principales métodos de Type están:

GetField() Obtiene el campo según el nombre.

GetMethod() Obtiene un método, y si éste tiene sobre cargas, al igual que el constructor, hay que pasarle el tipo correspondiente de la sobre carga.

GetProperty() Obtiene la propiedad según el nombre.

Nota: aparte de los métodos anteriores existen los mismos en plural, es decir que en vez de obtener un miembro, obtienes un arreglo con los resultados según los parámetros que le indiques. Ejm: GetProperty() tienes: GetProperties() el cual puedes llamar sin parámetros para obtener un PropertyInfo[] con todas las propiedades.

Let's do it. Ejemplo.

A continuación un ejemplo para fines académicos, dada una clase persona, usando reflection asignaré valores a sus propiedades. Primero lleno un diccionario cuya Key es el nombre de la propiedad de la clase y su Value obviamente el nombre que le quiero asignar a esa propiedad. Luego, recorro el diccionario para extraer sus propiedades y asignarles  un valor.

Imports System.Reflection
Imports System.Collections.Generic

Module Module1
    Sub Main()
        Dim atributosPersona As New Dictionary(Of String, String)
        atributosPersona.Add("pNombre", "Lizzy")
        atributosPersona.Add("pApellido", "Mendivil")

        Dim p As New clsPersona
        For Each atributo In atributosPersona
            Dim pf As PropertyInfo = p.GetType.GetProperty(atributo.Key)
            pf.SetValue(p, atributo.Value, Nothing)
        Next

        Console.WriteLine("Nombre: {0}", p.pNombre)
        Console.WriteLine("Apelllido: {0}", p.pApellido)
    End Sub

    Public Class clsPersona
        Private strNombre As String
        Private strApellido As String

        Public Property pNombre() As String
            Get
                Return strNombre
            End Get
            Set(ByVal value As String)
                strNombre = value
            End Set
        End Property

        Public Property pApellido() As String
            Get
                Return strApellido
            End Get
            Set(ByVal value As String)
                strApellido = value
            End Set
        End Property
    End Class
End Module

HaPPy Coding =)

Sunday, November 6, 2011

Web site vs web application

Si sos desarrollador .NET verás que tenés 2 opciones para crear proyectos web. Te has preguntado alguna vez cuál de los dos usarás? O... si hay 2 opciones, cuál es la mejor?

Veamos las diferencias que saltan a primera vista. Cheka la imagen siguiente:




Para empezar, el Web Site se agrega directamente con clic derecho sobre la solución. En cambio el Web Application hay que agregarlo desde la ventana dialog tal como se agrega un Class Library por ejemplo.

1.-

En Web Site, el código de diseño de la página se esconde completamente al desarrollador y se genera dinámicamente en tiempo de compilación.

En Web Application ese código está disponible y se llama igual que la página agregándose lo siguiente "designer.vb" (tal como lo podés ver en la imagen)

(A mi parecer esto está por demás ya que de nada sirve que lo tengás visible pues no vas a programar nada allí, es más, ni deberías tocarlo)

2.-

En los proyectos Web Site al precompilar la aplicación se genera una DLL por cada página o control de la aplicación, las cuales van dentro del directorio Bin.

En los proyectos de tipo Web Application se genera una única DLL que contiene el código completo de la aplicación, la cual se debe cargar en memoria sea necesario todo el código o no.

3.-

En Web Site podés editar el código de tus webforms en tiempo de ejecución.

Mientras que en los Web Applicacion esta opción no está habilitada. Tendrías que parar la ejecución, editar, y volver a ejecutar. o_O Esto realmente no me agrada (pero uno se acostumbra jejeje)

4.-

En Web Site no podés agregar una Class.vb en cualquier parte, sólo es posible dentro de la carpeta App_Data

En Web Application podés agregar una Class.vb en cualquier parte. Sin embargo esta opción no es de la gran importancia ya que quien es ordenado no agrega sus clases en "cualquier parte".

5.-

Cuando le das clic derecho sobre tu proyecto Sitio Web, no encontrás la opción "Properties" o "Propiedades"

Sin embargo, en los proyectos tipo Web Application sí tenemos esa opción. Esto llega a ser una gran ventaja ya que se tiene mayor control sobre su configuración.

En este link (en inglés) encontrás una ayuda de cuándo usar web site y cuándo web application.

En la Web encontrarás muchas más diferencias y más consejos a la hora de cuál de las dos opciones elegir.

Have a good choice! =)