R# ReSharper 6 - The most Intelligent Extension for VS

Hace algún tiempo descubrí un interesante plugin para Visual Studio, que ampliaba las capacidades propias del IntelliSense. Hoy quiero desgranar un poquito más este plugin, y comentarios las bondades del mismo. Un pequeño granito de arena para difundir este complemento realizado por el equipo de JetBRAINS

Indudablemente detrás de este plugin, se encuentra un gran trabajo de investigación y desarrollo, que puede seguir creciendo y evolucionando gracias a todos aquellos que participan del mismo.



Para aquellos que aún no lo conozcáis, ReSharper es un plugin que otorga, al igual que el IntelliSense, ayudas visuales durante el desarrollo del código fuente. Entre sus virtudes, se pueden destacar:

· Análisis del código en tiempo real, con indicaciones de errores.
· Actualización automática del código.
· Inserción de partes de código predefinido.
· Refactorización
· Reescritura de código en formato correcto.
...



Además, en la última actualización, se ha incluido soporte a Javascript y Razor para MVC, control de código CSS y HTML, ampliación del sistema de navegación y búsqueda, ... y muchas cosas más.
Aquí puedes ver las nuevas y mejoradas funcionalidades.

REFERENCIAS:
JetBRAINS
ReSharper

[...]

Leer más >>

Customize GridViewColumn: Personalizando columnas de gridview por código con controles

Muchas veces he tenido la necesidad de incluir información concreta en una columna de un GridView, y me ha costado mucho encontrar referencias que explicaran en profundidad cómo realizar la “customización” de una columna (sobre todo en castellano, porque no encontraba documentación al respecto).

En este post, vamos a explicar paso a paso cómo se puede personalizar completamente una columna de un GridView por código. En concreto, lo que realizaremos una personalización de una columna con un CheckBox  (que permita su edición), y una cabecera que seleccione todas las filas del grid.

Para ello debemos crear  una plantilla para la columna y una vez realizada, referenciarla desde la página del CodeBehind, indicándole así al grid cómo debe mostrar la información.

Dado que sería muy largo, lo he dividido en dos partes:
Parte I: Generación de la plantilla
    PASO 1: Generación de la plantilla ITemplate
    PASO 2: Control de eventos
Parte II: Construcción del GridView


PREVIO:
En este ejemplo, vamos a construir una columna de  CheckBox que controla un listado de test realizados por usuarios. El nombre de cada columna hará referencia al campo equivalente en la DDBB (así, Test1 sería la columna de los datos para el Test1). Además vamos a incluir en la cabecera una imagen que al pulsar, seleccionará todos los checks del gridview.


Parte I: Generación de la plantilla

PASO 1: Generación de la clase ITemplate
Para poder referenciar nuestra columna desde el GridView, necesitamos proporcionarle al sistema una forma de generar nuestra columna de CheckBox. Para ello hay que crear una clase que implemente el interfaz ITemplate. En nuestro ejemplo, denominaremos a la clase GridViewCheckboxTemplate.

public class GridViewCheckboxTemplate : ITemplate
{
    //Event handler - boton Header para “Seleccionar Todos”
    public event EventHandler ImageClick;

    //atributo para almacenar el ListItemType.
    ListItemType _templateType;

    //Atributo con el nombre identificador de la columna.
    private string _columnName;

    //Constructor donde definimos el tipo y nombre.
    public GridViewCheckboxTemplate(ListItemType type, string colname)
    {
        _templateType = type;
        _columnName = colname;
    }
 }

El ListItemType es el que nos indicará que parte del GridViewColumn estamos editando. Los valores que puede tomar son Header, Item, EditItem y Footer.

NOTA: En este caso, estamos generando una columna a partir de un constructor con 2 parametros. Podríamos crear otros constructores con más parámetros, en función de las necesidades.

Una vez implementados los atributos y el constructor, debemos indicar al sistema cómo ha de generar la vista de la columna en el GridView. Para ello, implementaremos el método ITemplate.InstantiateIn:

void ITemplate.InstantiateIn(System.Web.UI.Control container)
{
    switch (_templateType)
    {
        case ListItemType.Header:
            //TODO – elementos de la cabecera.
            break;
        case ListItemType.Item:
            //TODO – CheckBox en formato PRESENTACIÓN.
            break;
        case ListItemType.EditItem:
            //TODO –  CheckBox en formato EDICIÓN.
            break;
        case ListItemType.Footer:
            //TODO – elementos del footer.
            break;
    }
}

En la definición del método anterior podemos observar que, en función del tipo de ítem que estemos solicitando, el sistema generará unos controles u otros para el render de la columna completa. Por tanto, ya podemos incluir los controles necesarios para nuestra personalización:

HEADER:

Vamos a incluir un control ImageButton, de forma que aparezca un selector multiple que actualice todas las filas, y un Label con el nombre de la fila: 

case ListItemType.Header:
    ImageButton imgButton = new ImageButton();
    imgButton.ID = "imgHeader_" + _columnName;
    imgButton.ImageUrl = "~/images/ico/check_all.png";
    imgButton.ImageAlign = ImageAlign.AbsMiddle;
    imgButton.ToolTip = "Activar TODOS ";
    imgButton.Click += new ImageClickEventHandler(imgHeader_ClickEventHandler);
    imgButton.Attributes.Add("onclick", "return confirm('¿Seguro que desea activar todas las filas?');");
    container.Controls.Add(imgButton);

    //Creamos el label que indica en qué columna estamos.
    Label lbl = new Label();
    lbl.Text = " "+_columnName;
    container.Controls.Add(lbl);
    break;

Como se puede observar, para cada control establecemos todas sus propiedades, entre las que cabe destacar:
· La Url relativa a la raíz del proyecto la imagen que vamos a mostrar:
    imgButton.ImageUrl = "~/images/ico/check_all.png";  ->
· El evento que se disparará cuando se pulse sobre la imagen. Más adelante veremos cómo programar esta función:
        imgButton.Click += new ImageClickEventHandler(imgHeader_ClickEventHandler);
· Una confirmación de activación para todos los elementos:
        imgButton.Attributes.Add("onclick", "return confirm('¿Seguro que desea activar todas las filas?');");

ITEM y EDITITEM:
Como sólo vamos a mostrar un checkBox, simplemente debemos añadir dicho control a la columna:

case ListItemType.Item:
    //Creamos el checkBox.
    CheckBox chk = new CheckBox();
    chk.EnableViewState = true;
    chk.Enabled = false; //en vista, NO PERMITIMOS la modificación del valor.
    chk.ID = "chkItem_" + _columnName;
    chk.DataBinding += new EventHandler(CB1_DataBinding); //enlace a datos.
    container.Controls.Add(chk);
    break;

case ListItemType.EditItem:
    // Creamos el checkbox para edición
    CheckBox chkEdit = new CheckBox();
    chkEdit.EnableViewState = true;
    chkEdit.Enabled = true; //en edición, PERMITIMOS la modificación del valor
    chkEdit.ID = "chkEditItem_" + _columnName;
    chkEdit.DataBinding += new EventHandler(CB1_DataBinding);   //enlace a datos.
    container.Controls.Add(chkEdit);
    break;

A destacar el DataBinding que se encargará de mostrar la información al generar el GridView (ver paso 2 ‘Control de Eventos’), y la opción Enabled que es la que permite la modificación del estado del checkbox.

FOOTER:
En este ejemplo, no añadimos ningún elemento al footer, pero se podría personalizar con cualquier control que necesitaramos. Como ejemplos; un botón para añadir un nuevo ítem, ó un Label con información del total de registros, o ubicar aquí el selector multiple, etc.


NOTA: Recordar que si incluimos aquí cualquier control, en vista de diseño deberemos marcar el atributo ShowFooter a true.

PASO 2: Control de eventos
Una vez generado el método para construir la columna debemos controlar los eventos de datos y, en este ejemplo, del botón header para ‘Seleccionar todos’.

Control del click sobre la imagen
    void imgHeader_ClickEventHandler(object sender, ImageClickEventArgs e)
    {
        if (ImageClick != null) { ImageClick(sender, EventArgs.Empty); }
    }
Aquí simplemente verificamos que existe un EventHandler asociado a la imagen y en caso afirmativo, llamamos al delegado. Éste será el encargado de modificar los datos y actualizar el grid.

Control de los datos a mostrar
    void CB1_DataBinding(object sender, EventArgs e)
    {
        CheckBox chk = (CheckBox)sender; //Obtenemos el control
        GridViewRow container = (GridViewRow)chk.NamingContainer; //contenedor con datos
        object dataValue = DataBinder.Eval(container.DataItem, _columnName); //valor obtenido
        chk.Checked = (dataValue.ToString() == "1"); //actualización del check
    }

Aquí obtendremos el valor a mostrar en el CheckBox. Dado que en este ejemplo, en la DDBB tenemos una columna ‘Bit’, deberemos marcar la selección en función de si el valor es ‘0’ ó ‘1’.



Llegados a este punto, ya tenemos configurada nuestra plantilla completa para la columna del gridView. Recordad que en este ejemplo estamos trabajando con un CheckBox, pero se podría personalizar para cualquier tipo de control e información que os hiciese falta.

En el próximo post indicaré cómo hacer uso de esta clase, para generar nuestro grid personalizado.


Referencias:
MSDN Microsoft

Un saludo a todos!
[...]

Leer más >>

Microsoft lanza un sistema de logros en Visual Studio

Vamos con una entrada de juegos..... pero juegos para programadores.

Microsoft ha sacado "aún en versión beta" un plugin que nos ofrece una lista de "LOGROS" para todos aquellos que utilicemos Visual Studio. Es una forma de obtener un reconocimiento a nuestra forma de trabajar, y que este sea visible a todo el mundo (Achievements Visual Studio).

En concreto, se trata de un plugin para Visual Studio que obtiene información sobre tu metodología de trabajo en una solución y el análisis del código, y en función de esos datos, te irá desbloqueando distintos logros.



En principio los logros están dividios en seis secciones:
· Customizing Visual Studio
· Don't Try This At Home
· Good Housekeeping
· Just For Fun
· Power Coder
· Unleashing Visual Studio

(Ojo!! no todos los logros podrían estar bien vistos,.. el logro de Go To Hell me encanta!! - XD)

Pero no acaba ahí la historia. Dado que generas un registro en channel9.msdn.com, tus logros adquiridos pasarán a estar permanentemente publicados, con lo que podrás compararte con otros programadores del mundo... además permite su publicación en blogs y social media.

A qué estás esperando, conviértete en un Gamer del Visual Studio!
...¿a que no puedes probar sólo una? ...


REFERENCIAS

Announcing Visual Studio Achievements Beta
Achievements Visual Studio
[...]

Leer más >>

Remoting Flash MX y su instalación en Windows7 y Adobe Flash CS5.5

Tal y como indica el título, hoy os voy a indicar cómo instalar las librerías de los Remoting MX para AS2 en una máquina Windows 7, sobre Adobe Flash CS 5.5

Si al igual que yo, muchos de vosotros os encontráis desarrollando en Flash ActionScript y habéis decidido actualizar vuestro software, os encontraréis con el problema de migrar las apliaciónes de AS2 con Remoting Components a la nueva versión de Flash.

Aunque yo ya llevo mucho tiempo trabajando en AS3 sobre Fluorine Remotings (y os recomiendo encarecidamente que os paséis a esta versión del lenguaje de desarrollo), podéis encontraros en la necesidad de recuperar algún proyecto antiguo en AS2 que use aún esta tecnología.

Pues bien, para instalar esas dichosas librerías, debéis realizar los siguientes pasos:

INSTALACIÓN DE LAS LIBRERÍAS
1- Descarga del conjunto de librerías "\mx" "aquí". Por cortesía de este mágnifico post http://blog.alastairdawson.com/2007/04/17/actionscript-20-flash-remoting-with-flash-cs3/

2- Desde el explorador, accede a la carpeta '\First Run\Classes\' de la instalación de Adobe Flash, dentro de la carpeta de idioma instalado. En mi caso:
   C:\Program Files (x86)\Adobe\Adobe Flash CS5.5\es_ES\First Run\Classes\

3- Descomprime el archivo zip y ubica los elementos en dicha carpeta.

CONFIGURACIÓN DEL FLASH
4- Abre el flash CS5.5 y accede a "Edición/Preferencias", y en la ventana emergente, a la categoría "ActionScript". Una vez en las opciones, pulsa sobre "Configuración de ActionScript 2.0".



5- Sobre la ventana emergente que te saldrá, pulsa sobre el icono de la carpeta para seleccionar la ubicación de los archivos que instalaste en el paso 3, y pulsa Aceptar. Verás que se añade a tu lista de clases, las nuevas referencias que le has indicado.


6- Confirma todos los pasos y cierra las ventanas, y ... listo, ya tienes los remotings 2.0 instalados y referenciados en Flash CS5.5 sobre Windows7.

Como siempre, espero que os haya sido de utilidad.
¡Hasta la próxima!


[...]

Leer más >>

Cambiar la versión de ASP.NET de una aplicación en IIS6 desde la línea de comandos

Como indica el titulo de esta entrada, vamos a ver a continuación cómo modificar el NET Framework de una aplicación desde la línea de comandos, sin necesidad de utilizar la ventana de propiedades del Administrador de IIS 6.

ANTECEDENTES:
El motivo de generar esta entrada viene provocado por un pequeño problema que encontré al intentar crear una nueva aplicación en mi servidor de aplicaciones, el cual asigna por defecto la version 1.0 de ASP.NET. Este problema consistía en que cada vez que se generaba una nueva aplicación, el IIS se veía forzado a reiniciarse y provocaba una desconexión temporal de todas las aplicaciones que colgaban del directorio raíz o 'Sitio Web Predeterminado'.

Para evitar este reinicio, tenemos la opción de ejecutar el comando 'aspnet_regiis' desde el editor MS-DOS.

Los PASOS QUE DEBEMOS SEGUIR para crear una aplicación nueva son:
1. Generar la nueva apliación desde el IIS
2. Abrir la consola de "Símbolo de Sistema" y ejecutar la herramienta de registro desde la carpeta del framework adecuado.

1. Generar la nueva aplicación desde el IIS
A la hora de generar una aplicación, deberemos indicar desde la ventana de Propiedades-> Directorio el grupo de aplicaciones en la que desearemos incluirla. En nuestro ejemplo, la incluiremos en la versión 4.0, marcando dicha opción en el selector de grupo:


Si accedemos a la pestaña Propiedades->ASP.NET, en donde se indica la versión del framework, veremos que está marcada la que el sistema tiene por defecto. En nuestro ejemplo, la versión 1.1.




En la mayoría de los casos podremos modificar directamente aquí el valor sin mayor problema, pero si os ocurre lo mismo que a mi, deberéis utilizar la linea de comandos para modificarlo sin riesgo.


2. Abrir la consola de "Símbolo de Sistema" y ejecutar la herramienta de registro desde la carpeta del framework adecuado.

Lo primero que debemos hacer, tras abrir la consola, es ubicarnos en la carpeta contenedora del framework que deseamos actualizar, para ejecutar el comando de registro. Todos los frameworks instalados se encuentran en la carpeta C:\WINDOWS\Microsoft.NET\Framework.

Por tanto, y siguiendo con nuestro ejemplo, tendríamos que ejecutar la siguiente línea:
c:\ cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319

Una vez en la carpeta, sólo quedaría ejecutar el comando que modificará nuestra versión de la aplicación:
aspnet_regiis -norestart  -s W3SVC/[WebSiteID]/ROOT/[SampleApp1]

La sentencia final quedaría así:

c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis -norestart  -s W3SVC/1/ROOT/Prueba

Con esto habremos conseguido modificar la versión, sin reiniciar el IIS. Si volvemos ahora a nuestro administrador IIS, veremos que la versión de ASP.NET se ha actualizado correctamente.





NOTA IMPORTANTE:
aspnet_regiis -norestart  -s W3SVC/[WebSiteID]/ROOT/[SampleApp1]

Donde:
· [WebSiteID] es el identificador numérico del sitio web padre (por eso, modificar el sitio web por defecto es el 1)
· [SampleApp1] es la ruta de acceso desde el raiz del website a modificar;

Para encontrar dicho ID, simplemente debéis entrar en el IIS y pulsar en “sitios web” para mostrar el listado de todos los sitios. Luego, el numero que se encuentra en la columna “Identificar” es el que corresponda con el website que deseamos actualizar.
¡Espero que os haya servido! 
Un saludo y hasta la próxima.
[...]

Leer más >>

Importar tipografías en un HTML con CSS y @font-face

La verdad es que durante mucho tiempo he estado buscando información sobre cómo importar fuentes externas en los diseños HTML, y después de muchas búsquedas (algunas infructuosas o que no me llevaban a ningún sitio), he encontrado dos formas muy sencillas de realizar este trabajo.
· Google Fonts
· Font Squirrel

Normalmente se suelen incorporar utilizando varias técnicas, pero al final casi todas requieren del uso de @font-face en los estilos CSS. En algunos casos acababa encontrando conversores especiales de fuentes al formato EOT que sólo se veían en Internet Explorer, o en otros casos soluciones parciales que no se visualizaban en todos los navegadores.


GOOGLE FONTS
El uso de esta forma de implementar tipografías poco comunes es muy sencillo. Simplemente accedes a http://www.google.com/webfonts, buscas la fuente en una extensa lista disponible, y te mostrará el código que debes incluir en tu página para poder utilizarla (en formato <link type='text/css' >).

PROS:
· Uso sencillo
· Dispone de un buscador
· No necesita licencia
· Es compatible con todos los navegadores
CONTRAS:
· Algunos podrían decir que no dispone de demasiadas fuentes


FONT SQUIRREL
Font Squirrel es una magnífica aplicación con la que tendréis un generador de fuentes para su importación, totalmente gratuito y de muy fácil implementación (yo ya llevo un tiempo utilizándolo y puedo deciros que no me ha fallado en ningún navegador).
Os aseguro que hará las delicias de todos aquellos que queráis dar una "pinta especial" a vuestras webs.

Podéis acceder al generador a través de: http://www.fontsquirrel.com/fontface/generator

Mediante un sencillo interfaz podréis incorporar varias fuentes al generador, y el sistema creará un archivo descargable con todos los elementos necesarios para su uso. Dentro de dicho archivo también encontraréis ejemplos de código y vistas previas del resultado final.

PROS:
· Permite la conversión de cualquier fuente
· Es compatible con todos los navegadores
· En el archivo descargable vienen ejemplos de uso
CONTRAS:
· Se debe tener licencia legal sobre las fuentes a utilizar.
· Aunque es muy sencillo de utilizar, es posible que requiera de un conocimiento básico de CSS y HTML para no tener problemas al usarlo.


NOTA: Aunque es un servicio gratuito, siempre podréis donar un dinerillo para que siga en marcha.

Un saludo, y hasta la próxima.
[...]

Leer más >>

Agregar una propiedad en un control de usuario con C# y Atributos

En estos días he tenido la necesidad de hacer un control de usuario personalizado, de forma que se pudiera reutilizar en dos formatos distintos. Concretamente se trataba de un control que mostraba las etiquetas de un blog y que podía presentarse de dos formas distintas:
· en formato lista (tag list)
· en formato nube (o cloud tags)

Dado que los controles se cargan en la página mediante el uso de <%@ Register %>, quería que tuviese un parámetro opcional con valores personalizados (y uno por defecto) y que estuviese accesible, mostrando todos los valores posibles, desde la vista de diseño.

Evidentemente esto se puede realizar de muchas formas, pero quería utilizar los atributos existentes en .NET, por lo que el siguiente desarrollo está encaminado hacia ese uso.

GENERACIÓN DEL CÓDIGO

Lo primero que debemos crear es una enumeración con los valores que necesitamos controlar con posterioridad. Dado que en este caso, lo que queremos controlar es el tipo de "display" que vamos a ejecutar al cargar el control, vamos a generar una enumeración auxiliar llamada DisplayOption. Así, obtendríamos el siguiente fragmento de código:

public enum
DisplayOption
{
    ToList,
    ToCloud
}


Una vez generada nuestra enumeración, debemos crear una propiedad pública en nuestro control. De esta forma, el sistema identificará dicha propiedad con el valor que le asignemos y desde ese momento, podrá trabajar con él.

public
DisplayOption Display { get; set; }


Aunque el sistema podría reconocer directamente la propiedad pública, es bueno y recomendable hacer uso de los atributos, desde donde podremos indicarle si es accesible, a qué categoría pertenece, el valor por defecto y una breve descripción. Según esto, el código resultante sería:

[
Browsable(true),
Category("Appearance"),
DefaultValue(DisplayOption.ToList),
Description("Indica el tipo de desplegado usado para la visualización.")]
public DisplayOption Display { getset; }


NOTA: Se debe utilizar la librería "using System.ComponentModel;" para que el sistema reconozca los atributos utilizados.


Ya sólo nos queda modificar el código fuente del control para formatear la información según el valor que tenga la propiedad. Esto se podría hacer en la carga del control de forma:

protected void Page_Load(object sender, EventArgs e)
{
    if (Display == DisplayOption.ToList)
        GeneraListaDeEtiquetas();
    else
        GeneraNubeDeEtiquetas();
}


Una vez realizado este punto, ya podríamos acceder a dicha propiedad desde el diseñador, y además tendríamos listados en ella todos los elementos. Aunque no incluyesemos dicha propiedad en el diseñador, ya tendría un valor asignado por el atributo.


Así, tendríamos en la página contenedora el siguiente fragmento de código disponible:


<%@ Register TagPrefix="ctrl" TagName="NavTags" Src="~/controls/NavTagControl.ascx" %>

<ctrl:NavTags runat="server" ID="NavTagControl" Display="ToCloud"  />

Aquí podéis ver una captura del efecto final.





Enlaces de referencia:
User Controls Custom Properties
Walkthrough: Developing and Using a Custom Server Control
[...]

Leer más >>