miércoles, 27 de octubre de 2010

Nuevo Blog en GEEKS

Hola a todos,

Ahora voy a empezar a escribir en GEEKS.MS . Espero Leeros por alli y que me sigais leyendo.

Lo primero que quiero hacer es dar las gracias por el Blog tanto a Josue Yeray, como a Rodrigo, por darme la oportunidad de añadir mi granito de arena a Geeks.
Este blog va a tratar de mis experiencias programando en Tecnologías Microsoft, desde VB.Net y C# hasta SilverLight, aplicaciones Windows, Web, Algo para Mobile, Bases de Datos, Controles personalizados...
Espero que os guste, y leer vuestros comentarios.
Un saludo a todos!

Un saludo.

martes, 19 de octubre de 2010

MVC3: Validación de Elementos HTML condicional

Hasta ahora, tanto en aplicaciones WebForms como en ASP.NET MVC1 y ASP.NET MVC2, si queríamos dejar de comprobar la introducción de código HTML en alguno de los campos de nuestros formularios, teníamos que permitirlo en todos los campos, y a través de nuestras propias validaciones tratar de no permitirlo (javascript o código servidor).

En la Beta de MVC3, ha aparecido una modificación en el Atributo ValidateInput, que nos permite excluir algunos campos a la hora de validar nuestro formulario.

El nuevo parámetro del atributo, se llama Exclude, y nos permite introducir distintos campos de nuestro formulario separados por comas. Aquí va un ejemplo de la sintaxis:

[ValidateInput(true,Exclude="ContentPost")]

public ActionResult CreatePost()
       {
         //Contenido de la vista.

       }

 

Espero que os sea de utilidad!

Saludos.


PD: se me olvido citar la fuente WhitePaper MVC 3.

lunes, 18 de octubre de 2010

CODEPLEX: TabControl con mejoras

Desde las versiones antiguas de Visual Studio, me he encontrado con un pequeño problema a la hora de trabajar con el TabControl: Ocultar / Mostrar las TabPages.

Pese a que el control TabControl, presenta una propiedad “TabPageCollection” que alberga todas las TabPages del Control, y a su vez cada TabPage tienen unos métodos Hide y Show, su funcionamiento no es el que “yo” desearía. Me explico:

- Si yo llamo al método Hide de un TabPage, me gustaría que este TabPage no fuera visible de cara al usuario.

miércoles, 13 de octubre de 2010

MVC: Helper WebGrid(3)

Días atrás, os hable de este helper(aquí y aquí). Hoy voy a dar mas detalles de la personalización que nos aporta.

lunes, 11 de octubre de 2010

viernes, 8 de octubre de 2010

MVC3: Helper WebGrid

Como todos sabréis hace 2 día salieron grandes novedades en Microsoft, con la Beta de MVC3, NuPack y WebMatrix Beta 2 (Anuncio de ScottGu).

Este post va dedicado a un Helper agregado en MVC3 que no estaba en MVC2: WebGrid.

miércoles, 29 de septiembre de 2010

SL4: Problema al definir un estilo en DataGridColumnHeader

Llevo unos días de aprendizaje con MVC y también me he metido a aprender a manejar SILVERLIGHT 4 con VS 2010.

A través del BLOG de Josué Yeray, he ido cogiendo muchos conceptos que también aplican a WPF.

Bueno a lo que iba.

Me he encontrado una problemática un tanto curiosa a la hora de intentar establecer los estilos dentro de un Control DataGrid.

lunes, 20 de septiembre de 2010

Que son los Atributos y su uso en .NET

Hola a tod@s.

Llevo un tiempo OFF del Blog, porque ando haciendo un proyecto, que espero que vea la luz dentro de poco, y sobre el cual publicaré algunos artículos en el BLOG.
Os traigo un pequeño ejemplo hecho con MVC2 y XML.
Este ejemplo viene a servir para destacar el uso de los atributos en el código.
Si entrais aquí , podréis ver más en detalle la definición de los atributos.

lunes, 16 de agosto de 2010

Regreso de las vacaciones

Hola a todos, acabo de regresar de las vacaciones, donde he podido cargar un poco las pilas.

Me gustaria que me dejarais comentarios acerca de los temas que os gustaria que vaya tratando en el blog.

Un saludo a Todos!

lunes, 5 de julio de 2010

Entity Framework (3 de N): ObjectContext y ObjectSet

Vamos a por el tercer post de EF, en él, voy a empezar a explicar un poco el código que nos genera VS.
En el momento en el que generamos un EDMX, y agregamos nuestras Tablas de Datos que pasan a ser entidades del módelo, VS genera el fichero XXX.Designer.VB.
Este fichero va a contener, toda la información relativa al contexto de manejo de los datos, las entidades, y las asociaciones existentes entre las distintas entidades.

viernes, 2 de julio de 2010

Entity Framework (2 de N)

Aquí viene el segundo post de la serie de EF.
Si recordais el primer mensaje, puse una imagen con las tablas y con sus relaciones. Está imagen está tomada desde VS con el origen de datos que definimos.

Como podeis apreciar en la imagen, vemos 4 tablas que vienen de la Base de Datos y han sido convertidas en Entidades dentro de nuestro modelo.

jueves, 1 de julio de 2010

Entity Framework (1 de N)

Continuando con mi último post (sigo dando formación), ahora me encuentro explicando un poco Entity Framework, desde mi leve conocimiento del mismo voy a dar una pequeña explicación y guía para su uso.
Entity Framework (a partir de aquí EF) permite la interactuación entre código .NET y un modelo de datos relacional de manera bastante agil y sencilla.

miércoles, 30 de junio de 2010

Detectar Cambios en una Clase

Hola, después de un tiempo donde no he podido escribir nada, os traigo este post acerca de la Interfaz "INotifyPropertyChanged".

Ya que ando dando una formación de VB2008, he estado dando un breve ejemplo de LINQTOSQL.

Uno de mis alumnos me pregunto: ¿Cómo puedo determinar si los controles que tengo en un formulario han cambiado?

jueves, 13 de mayo de 2010

Obtención del Esquema de una Base de Datos

En este post voy a tratar de explicar brevemente como obtener el Esquema de una Base de Datos a través de nuestra conexión.

lunes, 19 de abril de 2010

A la presentación de VS2010 de Madrid

Mañana voy al evento de presentación de VS2010 en Madrid, ire poniendo algunos comentarios a través de Twitter en @jtorrecilla.

Saludos!

martes, 13 de abril de 2010

Pequeño Tip de VS2010

Hola aqui os pongo un pequeño TIP de VS2010.

Para aquellos que no lo sepan, existe la seleccion vertical de código (en columna), con el atajo de teclado " Shift + Alt + flecha".

Bueno, lo interesante del TIP (en imagenes)
Dado el código:

Seleccionamos el valor origen y lo copiamos(Ctrl + C)

Seleccionamos con el TIP las lineas.

Pegamos lo obtenido al principio (Ctrl + V)


Este tip es válido tanto en C# como en VB. Tiene ventaja C# por la sintaxis!

El articulo original lo podeis encontrar aquí.

Un saludo.

martes, 30 de marzo de 2010

Training Kit Windos Phone 7

Hola,

Os dejo un enlace al Training Kit de Windows Phone 7.

Para los que no lo sepan, esta disponible para VS2010 RC, unicamente se podrá pogramar en C# (de momento), y las aplicaciones van a estar basadas en SilverLigth.

Saludos

Videos interesantes acerca de SilverLight

Aqui os dejo un enlace a un blog en el que muestran algunos videos interesantes sobre SilverLight.

Videos

PD: Espero que me dejen aplicarlo en un modulo de mi proyecto.

viernes, 26 de marzo de 2010

MAP (Microsoft Active Professional)

Hace unos días, me llego un email que decía lo siguiente:

"El equipo de Microsoft España quiere reconocer tu esfuerzo constante por participar activamente en nuestros programas de formación y por estar pendiente durante el ultimo año de nuestra tecnología.
Valoramos tu compromiso, que hace que te encuentres entre el 5% mas actualizado de una de las comunidades técnicas mas importantes a nivel mundial. Por ello queremos...."

Saludos.

miércoles, 24 de marzo de 2010

Añadir Eventos a Control creado en Runtime

No voy a entrar muy en detalle, pero he visto ultimamente varios mensajes por el foro de como controlar determinado evento den un control creado en tiempo de ejecucion, y como saber en que control estamos.

Voy a poner un pequeño ejemplo de como asignarle un manejador de eventos (handler) a un control y como utilizarlo.

EN VB

'Esto se agregará donde se cree el control
Dim cmdBotonEjemplo as New Button()
cmbBotonEjemplo.Name="BotonN"
cmbBotonEjemplo.Text="Boton de Ejemplo"
Addhandler cmdBotonEjemplo.Click, AddressOf NombreEventoClick
me.Controls.Add(cmdBotonEjemplo)
'Esto se escribirá en la clase.
Private Sub NombreEventoClick(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub

EN C#

//Esto se agregará donde se cree el control
Button cmdBotonEjemplo = new Button();
cmdBotonEjemplo.Name="BotonN";
cmbBotonEjemplo.Text="Boton de Ejemplo";
cmdBotonEjemplo.Click += new System.EventHandler(NombreEventoClick);
this.Controls.Add(cmdBotonEjemplo);

//Esto se escribirá en la clase.
private void NombreEventoClick(object sender, EventArgs e)
{

}


Con esto ya tendremos creado nuestro manejador de eventos para el botón creado en runtime.

Esto se puede realizar con cualquier control y cualquier evento, lo único que tendremos que tener en cuenta es la firma de los eventos a la hora de crearlos.

Saludos.

jueves, 18 de marzo de 2010

Examenes Beta de Certificacion VS 2010

Hola revisando los foros msdn de USA, me he topado con este enlace:
http://blogs.technet.com/betaexams/default.aspx

En el que hablan de la disponibilidad de hacer un examen de certificacion Beta sobre VS 2010 sobre diversas tecnologias.

El coste del examen es gratuito ya que aportan un codigo promocional de descuento.

Espero que os interese.

Un saludo.

lunes, 25 de enero de 2010

Formatear con separadores de miles una cadena

Hola, ultimamente, he visto esta pregunta tanto en foros de EEUU como de HispanoAmerica, por ello me decido a colgar este pequeño ejemplo en C#, tambien lo disponible en VB por si alguien lo necesita:


Para que funcione correctamente ha de invocarse a la funcion desde el evento KeyUP




CODIGO C#


 public string Puntos(string strValor, int intNumDecimales)
{

    string strAux = null;
    string strComas = null;
    string strPuntos = null;
    int intX = 0;
    bool bolMenos = false;

    strComas = "";
    if (strValor.Length == 0) return "";
    strValor = strValor.Replace(Application.CurrentCulture.NumberFormat.NumberGroupSeparator, "");
    if (strValor.Contains(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator)) {
        strAux = strValor.Substring(0, strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator));
        strComas = strValor.Substring(strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator) + 1);
    }
    else {
        strAux = strValor;
    }

    if (strAux.Substring(0, 1) == Application.CurrentCulture.NumberFormat.NegativeSign) {
        bolMenos = true;
        strAux = strAux.Substring(1);
    }

    strPuntos = strAux;
    strAux = "";
    while (strPuntos.Length > 3) {
        strAux = Application.CurrentCulture.NumberFormat.NumberGroupSeparator + strPuntos.Substring(strPuntos.Length - 3, 3) + strAux;
        strPuntos = strPuntos.Substring(0, strPuntos.Length - 3);
    }
    if (intNumDecimales > 0) {
        if (strValor.Contains(Application.CurrentCulture.NumberFormat.PercentDecimalSeparator)) {
            strComas = Application.CurrentCulture.NumberFormat.PercentDecimalSeparator + strValor.Substring(strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.PercentDecimalSeparator) + 1);
            if (strComas.Length > intNumDecimales) {
                strComas = strComas.Substring(0, intNumDecimales + 1);
            }
         
        }
    }
    strAux = strPuntos + strAux + strComas;
   

    return strAux;
}




        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            textBox1.Text = Puntos(textBox1.Text, 0);
            textBox1.Select(textBox1.TextLength, 0);
        }


CODIGO VB:

    Public Function Puntos(ByVal strValor As String, ByVal intNumDecimales As Integer) As String

        Dim strAux As String = ""
        Dim strComas As String = ""
        Dim strPuntos As String = ""
        Dim intX As Integer = 0
        Dim bolMenos As Boolean = False

        If strValor.Length = 0 Then
            Return ""
        End If
        strValor = strValor.Replace(Application.CurrentCulture.NumberFormat.NumberGroupSeparator, "")
        If strValor.Contains(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator) Then
            strAux = strValor.Substring(0, strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator))
            strComas = strValor.Substring(strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator) + 1)
        Else
            strAux = strValor
        End If

        If strAux.Substring(0, 1) = Application.CurrentCulture.NumberFormat.NegativeSign Then
            bolMenos = True
            strAux = strAux.Substring(1)
        End If

        strPuntos = strAux
        strAux = ""
        While strPuntos.Length > 3
            strAux = Application.CurrentCulture.NumberFormat.NumberGroupSeparator + strPuntos.Substring(strPuntos.Length - 3, 3) + strAux
            strPuntos = strPuntos.Substring(0, strPuntos.Length - 3)
        End While
        If intNumDecimales > 0 Then
            If strValor.Contains(Application.CurrentCulture.NumberFormat.PercentDecimalSeparator) Then
                strComas = Application.CurrentCulture.NumberFormat.PercentDecimalSeparator + strValor.Substring(strValor.LastIndexOf(Application.CurrentCulture.NumberFormat.PercentDecimalSeparator) + 1)
                If strComas.Length > intNumDecimales Then
                    strComas = strComas.Substring(0, intNumDecimales + 1)

                End If
            End If
        End If
        strAux = strPuntos + strAux + strComas


        Return strAux
    End Function


    Private Sub TextBox1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
        TextBox1.Text = Puntos(TextBox1.Text, 2)
        TextBox1.Select(TextBox1.TextLength, 0)
    End Sub

Para evitar, que metan en la caja de texto mas de un caracter decimal:

c#

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (textBox1.Text.Contains(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator) && (e.KeyChar == Application.CurrentCulture.NumberFormat.NumberDecimalSeparator))
                e.Handled = true;
            else
                e.Handled = false;
        }


VB


 Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If TextBox1.Text.Contains(Application.CurrentCulture.NumberFormat.PercentDecimalSeparator) And (e.KeyChar = Application.CurrentCulture.NumberFormat.PercentDecimalSeparator) Then
            e.Handled = True
        Else
            e.Handled = False
        End If
    End Sub




sábado, 16 de enero de 2010

Pequeños truquillos(1)

Os dejo una lista de truquillos de código que más de una vez nos salvan de apuros:
CONOCER LA RUTA DIRECTORIO ESPECIAL:
Para conocer la ruta de un directorio especial dentro del equipo (Mis documentos, Mis Imágenes)….
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

La enumeración SpecialFolder del Namespace nos indica algunos directorios especiales y con la función GetFolderPath obtenemos la ruta completa

CONOCER EL DIRECTORIO EN EL QUE ESTAMOS TRABAJANDO:

Environment.CurrentDirectory

CONOCER LA RUTA DEL FICHERO EXE DE NUESTRA APLICACIÓN

Application.StartUpPath

OBTENER UN LISTADO DE LAS UNIDADES DE NUESTRO EQUIPO (1):
For Each Str As String In Environment.GetLogicalDrives()
            MsgBox(Str)
        Next
OBTENER UN LISTADO DE LAS UNIDADES DE NUESTRO EQUIPO (2):

Versión con expresión Lambda y lista…

Environment.GetLogicalDrives().ToList.ForEach(Function(str) Msgbox(str))

OBTENER UN LISTADO DE LOS PARAMETROS RECIBIDOS EN LA LINEA DE COMANDOS:

Environment.GetCommandLineArgs()

DETERMINAR SI UN FICHERO EXISTE
 My.Computer.FileSystem.FileExists("RUTAFICHERO.EXTENSION")

OBTENER EL LISTADO DE FICHEROS DE UN DIRECTORIO:
My.Computer.FileSystem.GetFiles("DIRECTORIO")

DETERMINAR LA INFORMACIÓN DE UN FICHERO:
My.Computer.FileSystem.GetFileInfo("FICHERO")

DETERMINAR LA INFORMACION DE UN DIRECTORIO:
My.Computer.FileSystem.GetDirectoryInfo("DIRECTORIO")

Continuará…

domingo, 10 de enero de 2010

Rellenar un listview con un DataTable y usar filtros.

Muchas veces se pregunta en los foros formas alternativas al datagridview de visualizar los datos en una aplicación WinForms.
Para ello, he hecho un pequeño proyecto y voy a ir detallanado su funcionamiento:
1ª Parte: Definición del Listview
Para que el Listview tenga un aspecto más adecuado a nuestras pretensiones vamos a cambiar 2 de sus propiedades:
-          View: Es la forma de represantar los datos. Vamos a establecer que sea del tipo “Details”.
-          GridLines: Cuando se encuentra en el modo “Details” se pueden ver o no las líneas. Vamos a establecer el valor a “True”
2ª Parte: Obtener los datos
Como en todos los controles de representación de datos necesitamos los datos que vamos a visualizar. Para ello, he creado una pequeña base de datos Access con una tabla Movies, con los siguientes campos:
1 ID
2 Titulo
3 Director
4 Descripcion
Podeis usar vuestras propias clases para obtener los datos, yo lo he hecho con un DataAdapter llenando una tabla.
  Function BuscarDatos(ByRef dt As DataTable, Optional ByVal filtro As String = "") As Boolean
        Dim bolResultado As Boolean = True

        Dim cmd As OleDbCommand
        Try
            If dt Is Nothing Then dt = New DataTable

            Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\movies.accdb;Persist Security Info=False;")
                cmd = New OleDbCommand("SELECT ID,TITULO,DIRECTOR,DESCRIPCION FROM MOVIES WHERE TITULO LIKE @FILTRO OR " & _
                                     " DIRECTOR LIKE @FILTRO OR DESCRIPCION LIKE @FILTRO", con)
                cmd.Parameters.AddWithValue("@FILTRO", "%" & filtro & "%")
                Using DA As New OleDbDataAdapter(cmd)
                    DA.Fill(dt)
                End Using
            End Using
        Catch ex As Exception
            bolResultado = False
        End Try
        Return bolResultado
    End Function
La función recibe como parámetros:
Un datatable para guardar los datos. Lo recibe por referencia.
Y de forma opcional un filtro.
La función si se ejecuta correctamente nos va a devolver “True”, en otro caso nos devolverá false.
3ª Rellenar El Listview
Una vez que tenemos nuestro Datatable relleno, es hora de mostrar los datos en el ListView, para ello, haremos uso de la siguiente función:
Function RellenarListview(ByVal dt As DataTable) As Boolean
        Dim bolResultado As Boolean = True
        Dim lstElemento As ListViewItem
        Try
            Me.lvwDatos.Items.Clear()
            Me.lvwDatos.Columns.Clear()
            For Each col As DataColumn In dt.Columns
                lvwDatos.Columns.Add(col.ColumnName, col.ColumnName)
            Next
            For Each row As DataRow In dt.Rows
                lstElemento = New ListViewItem
                lstElemento.Text = row(0).ToString()
                For intcontador As Integer = 1 To dt.Columns.Count - 1
                    lstElemento.SubItems.Add(row(intcontador).ToString())
                Next
                lvwDatos.Items.Add(lstElemento)
            Next
            Me.lvwDatos.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
        Catch ex As Exception
            bolResultado = False
        End Try
        Return bolResultado
    End Function
4ª Filtrar los datos.
En el ejemplo, al ser una base de datos realmente pequeña, el filtrado de datos lo hago directamente con respecto de la base de datos, pero no es la única forma de hacerlo, también lo podemos hacer a través de filtros en el propio datatable a través de la función “Select”.
En este ejemplo, he creado el botón “Filtrar” y el checkBox “Filtrado Automatico”. Ambas funcionalidades hacen que se filtre el contenido del listview, pero en distintos lugares.
El botón Filtrar, evidentemente, provoca el filtrado en el evento Click del botón, sin embargo cuando tenemos marcado el checkBox de “Filtrado automatico”, se filtran los datos según vayamos escribiendo en la caja de texto.

Espero que os haya gustado el articulo.
PD: El ejemplo está hecho en VB 2010 Beta 2, pero es completamente aplicable a vb2008 y vb2005.
PD2: Si necesitais el ejemplo en c# no dudéis en pedírmelo.