miércoles, 27 de agosto de 2014

IComparable vs IComprarer en c#

Collapse imageEn esta página

Collapse imageResumen

En este artículo paso a paso se describe el uso de dos interfaces: IComparer y IComparableEstas interfaces se describen en el mismo artículo por dos razones. Estas interfaces suelen utilizarse juntas, y aunque las interfaces son similares (y tienen nombres similares), usan con otros fines.

Si tiene una matriz de tipos (como cadena o entero) que ya admiten IComparer, puede ordenar dicha matriz sin proporcionar ninguna referencia explícita a IComparerEn ese caso, los elementos de la matriz se convierten a la implementación deIComparer (Comparer.Default) para usted. Sin embargo, si desea proporcionar funcionalidad de ordenación o comparación para los objetos personalizados, debe implementar una o ambas de estas interfaces.

El espacio de nombres de biblioteca de clases de.NET Framework siguiente se hace referencia en este artículo:
System.Collections

IComparable

La función de IComparable es proporcionar un método para comparar dos objetos de un tipo determinado. Esto es necesario si desea proporcionar ninguna capacidad de ordenación para el objeto. Piense en IComparable como proporcionar un orden predeterminado para los objetos. Por ejemplo, si tiene una matriz de objetos de su tipo y se llama al método deordenación de dicha matriz, IComparable proporciona la comparación de objetos durante la ordenación. Cuando se implementa la interfaz IComparable , debe implementar el método CompareTo , como sigue:

// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
   car c=(car)obj;
   return String.Compare(this.make,c.make);

}
    
La comparación en el método es diferente según el tipo de datos del valor que se va a comparar. String.Compare se utiliza en este ejemplo, debido a que se ha elegido para la comparación es una cadena.


IComparable

La función de IComparer es proporcionar mecanismos adicionales de comparación. Por ejemplo, desea proporcionar la ordenación de la clase en varios campos o propiedades, ascendente y descendente en el mismo campo, o en ambos. 

Mediante IComparer es un proceso de dos pasos. En primer lugar, declare una clase que implementa la interfaz IComparery, a continuación, implemente el método de comparación :

private class sortYearAscendingHelper : IComparer
{
   int IComparer.Compare(object a, object b)
   {
      car c1=(car)a;
      car c2=(car)b;
      if (c1.year > c2.year)
         return 1;
      if (c1.year < c2.year)
         return -1;
      else
         return 0;
   }
}
    
Tenga en cuenta que el método IComparer.Compare requiere una comparación terciaria. 1, 0, -1 o se devuelve en función de si un valor es mayor que, igual a, o menos que el otro. Puede cambiar el orden (ascendente o descendente) cambiando los operadores lógicos en este método.

El segundo paso es declarar un método que devuelve una instancia del objeto IComparer :

public static IComparer sortYearAscending()
{      
   return (IComparer) new sortYearAscendingHelper();
}
    
En este ejemplo, el objeto se utiliza como segundo argumento cuando se llama al método Array.Sort sobrecargado que acepta IComparerEl uso de IComparer no se limita a arreglos de discos. Se acepta como argumento en un número de colección diferente y las clases de control.


IComparer

En el ejemplo siguiente se muestra el uso de estas interfaces. Para demostrar IComparer IComparable , se crea una clase denominada automóvil . El objeto de automóvil tiene las propiedades año . Una ordenación ascendente para la que está habilitado el campo a través de la interfaz IComparable y un orden descendente en la que el campo está habilitada mediante la interfaz IComparer . Tanto ascendente y descendente a ordena se proporcionan para la propiedad año mediante el uso deIComparer .
  1. En Visual C#, cree un nuevo proyecto de aplicación de consola. Nombre de la aplicación ConsoleEnum.
  2. Cambiar el nombre de Program.cs como Host.cs y, a continuación, reemplace el código con el código siguiente.

    Nota En Visual Studio .NET 2003, cambie el nombre Class1.cs como Host.cs.

    using System;
    
    namespace ConsoleEnum
    {
       class host
       {
          [STAThread]
          static void Main(string[] args)
          {
             // Create an arary of car objects.      
             car[] arrayOfCars= new car[6]
             {
                new car("Ford",1992),
                new car("Fiat",1988),
                new car("Buick",1932),
                new car("Ford",1932),
                new car("Dodge",1999),
                new car("Honda",1977)
             };
          
             // Write out a header for the output.
             Console.WriteLine("Array - Unsorted\n");
    
             foreach(car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);
          
             // Demo IComparable by sorting array with "default" sort order.
             Array.Sort(arrayOfCars);
             Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");
    
             foreach(car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);
    
             // Demo ascending sort of numeric value with IComparer.
             Array.Sort(arrayOfCars,car.sortYearAscending());
             Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");
    
             foreach(car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);
    
             // Demo descending sort of string value with IComparer.
             Array.Sort(arrayOfCars,car.sortMakeDescending());
             Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");
    
             foreach(car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);
    
             // Demo descending sort of numeric value using IComparer.
             Array.Sort(arrayOfCars,car.sortYearDescending());
             Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");
    
             foreach(car c in arrayOfCars)
                Console.WriteLine(c.Make + "\t\t" + c.Year);
         
             Console.ReadLine();
          }
       }
    }
         
  3. Agregar una clase al proyecto. Nombre de la clase automóvil .
  4. Reemplace el código de Car.cs con lo siguiente:

    using System;
    using System.Collections;
    namespace ConsoleEnum
    {   
       public class car : IComparable
       {      
          // Beginning of nested classes.
    
          // Nested class to do ascending sort on year property.
          private class sortYearAscendingHelper: IComparer
          {
             int IComparer.Compare(object a, object b)
             {
                car c1=(car)a;
                car c2=(car)b;
    
                if (c1.year > c2.year)
                   return 1;
    
                if (c1.year < c2.year)
                   return -1;
    
                else
                   return 0;
             }
          }
    
          // Nested class to do descending sort on year property.
          private class sortYearDescendingHelper: IComparer
          {
             int IComparer.Compare(object a, object b)
             {
                car c1=(car)a;
                car c2=(car)b;
    
                if (c1.year < c2.year)
                   return 1;
    
                if (c1.year > c2.year)
                   return -1;
    
                else
                   return 0;
             }
          }
    
          // Nested class to do descending sort on make property.
          private class sortMakeDescendingHelper: IComparer
          {
             int IComparer.Compare(object a, object b)
             {
                car c1=(car)a;
                car c2=(car)b;
                 return String.Compare(c2.make,c1.make);
             }
          }
    
          // End of nested classes.
    
          private int year;
          private string make;
            
          public car(string Make,int Year)
          {
             make=Make;
             year=Year;
          }
    
          public int Year
          {
             get  {return year;}
             set {year=value;}
          }
    
          public string Make
          {
             get {return make;}
             set {make=value;}
          }
    
          // Implement IComparable CompareTo to provide default sort order.
          int IComparable.CompareTo(object obj)
          {
             car c=(car)obj;
             return String.Compare(this.make,c.make);
          }
    
          // Method to return IComparer object for sort helper.
          public static IComparer sortYearAscending()
          {      
             return (IComparer) new sortYearAscendingHelper();
          }
    
          // Method to return IComparer object for sort helper.
          public static IComparer sortYearDescending()
          {      
             return (IComparer) new sortYearDescendingHelper();
          }
    
          // Method to return IComparer object for sort helper.
          public static IComparer sortMakeDescending()
          {      
            return (IComparer) new sortMakeDescendingHelper();
          }
    
       }
    }
         
  5. Ejecute el proyecto. El resultado siguiente aparece en la ventana de la consola:

    Array - Unsorted
    
    Ford            1992
    Fiat            1988
    Buick           1932
    Ford            1932
    Dodge           1999
    Honda           1977
    
    Array - Sorted by Make (Ascending - IComparable)
    
    Buick           1932
    Dodge           1999
    Fiat            1988
    Ford            1932
    Ford            1992
    Honda           1977
    
    Array - Sorted by Year (Ascending - IComparer)
    
    Ford            1932
    Buick           1932
    Honda           1977
    Fiat            1988
    Ford            1992
    Dodge           1999
    
    Array - Sorted by Make (Descending - IComparer)
    
    Honda           1977
    Ford            1932
    Ford            1992
    Fiat            1988
    Dodge           1999
    Buick           1932
    
    Array - Sorted by Year (Descending - IComparer)
    
    Dodge           1999
    Ford            1992
    Fiat            1988
    Honda           1977
    Buick           1932
    Ford            1932
         
Fuente: http://support.microsoft.com/kb/320727/es

Permitir paginacion en un GridView usando DataReader

Para poder paginar un gridView cuyo contenido lo tenemos en una consulta SQL y ejecutada sobre un DataReader debemos de utilizar un componente compatible con IEnumerable. Por tanto directamente no es posible. Debemos usar otro objeto como por ejemplo un DataTable. Veamoslo:

private void cargarDatos(){          
           ...
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            string vConsulta = "SELECT ...."
            SqlDataReader rdr = cmd.ExecuteReader();
            if (rdr.HasRows)
            {
                    GridView1.DataSource = rdr;
                     GridView1.DataBind();
            }
           ...
}

Este código es perfectamente válido para mostrar los resultados en el GridView.

Pero supongamos que quisieramos paginar el contenido del GridView1. Para ello debemos definir la popiedad del gridView AllowPaging = true y definir su metodo pageIndexChanging

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView gv = (GridView)sender;
            gv.PageIndex = e.NewPageIndex;
            cargarDatos();
        }

Para que funcione la paginacion deberiamos cambiar la asignacion:

 GridView1.DataSource = rdr;

por esta otra

DataTable dt = new DataTable();
dt.Load(rdr);

GridView1.DataSource = dt;

Datatable implementa IEnumerable y permite la paginacion correctamente


miércoles, 13 de agosto de 2014

Personalizar la pantalla de inicio de windows 8

Personalizar la pantalla Inicio de Windows 8
Puedes personalizar totalmente la pantalla Inicio de Windows 8 y agregar nuevas aplicaciones para que puedas ver de un simple vistazo la información más importante y acceder rápidamente a tus programas favoritos. En la pantalla Inicio de Windows 8 se muestra un gran número de iconos de manera estándar, como Correo, Contactos, Escritorio, Mensajes, El Tiempo, Calendario, Fotos, Internet Explorer, Mapas, Noticias, etc. Muchos de ellos sirven para abrir programas específicos, como Internet Explorer. También hay "iconos dinámicos" que se pueden usar no solo para abrir una aplicación, sino también para mostrar información actualizada. Los iconos El Tiempo, Calendario y Finanzas son algunos ejemplos. Puede que los iconos que se muestran en la pantalla Inicio no sean de tu agrado. No te preocupes: puedes reorganizar fácilmente todas las cosas a tu gusto.

Personalizar la pantalla Inicio

Es aconsejable que muevas a la izquierda los iconos que usas más a menudo. Es muy sencillo: pulsa en un icono con el dedo o haz clic en él con el mouse, mantenlo pulsado y arrastra el icono al lugar que desees. Un icono tiene una forma cuadrada o rectangular. Para cambiarlo de tamaño, pulsa en él y mantenlo pulsado, desliza rápidamente el dedo un poco hacia abajo hasta que aparezca una cruz en la parte superior derecha, o haz clic con el botón secundario del mouse en el icono y selecciona la opción Pequeño que aparece en la barra en la parte inferior de la pantalla. Para aumentar el tamaño de un icono pequeño, selecciona el icono en cuestión tal como se indica arriba y elige Grande. Para los iconos dinámicos, puedes usar este procedimiento si quieres desactivar temporalmente la aplicación seleccionando la opción Desactivar el icono dinámico en la barra de la parte inferior de la pantalla. Puedes quitar un icono de la pantalla Inicio seleccionando la opción Desanclar de Inicio. Sin embargo, esta operación no quitará totalmente el programa subyacente o la aplicación asociada. Para ello tienes que usar la opción Desinstalar.

Colores diferentes

Es fácil colocar los iconos nuevos y existentes en otro lugar: haz clic con el botón secundario en la pantalla Inicio (no en el icono) y haz clic en Todas las aplicaciones abajo a la derecha. Se muestra una visión general de todas las aplicaciones disponibles. Haz clic con el botón secundario en el icono que quieras agregar a la pantalla Inicio y haz clic en Anclar a Inicio en la barra de la parte inferior de la pantalla. Para cambiar el color de la pantalla Inicio, o para cambiar la imagen de fondo o de la pantalla de bloqueo, selecciona Configuración (en la barra Accesos de la derecha) >> Cambiar configuración de PC >> Configuración personal. Puedes elegir tu propia imagen para la pantalla de bloqueo a través de Pantalla de bloqueo >> Examinar y cambiar la imagen de fondo de la pantalla Inicio mediante la opción Pantalla Inicio.

Agrupar iconos

Puedes agrupar iconos para que la pantalla Inicio te resulte más fácil de usar. Si arrastras un icono horizontalmente al extremo izquierdo o derecho, se muestra una barra vertical de color gris claro. Puedes usar estas barras para agrupar los iconos de las aplicaciones relacionadas. Por ejemplo, puedes crear un grupo para Comunicación con los iconos de Calendario, Mensajes, Correo y Contactos, o un grupo para Noticias con los iconos de Finanzas, Noticias, Deporte, etc. También puedes asignar un nombre a estos grupos. Haz clic en el signo menos en la parte inferior derecha, o aleja la pantalla juntando el pulgar y el dedo índice en la pantalla táctil. Se mostrará una visión general más pequeña de todos los iconos en la pantalla. Haz clic con el botón secundario o pulsa en el grupo recién creado y arrástralo un poco hacia abajo (hasta que aparezca una cruz en la parte superior derecha del grupo), y haz clic en Dar nombre al grupo en la barra de la parte inferior de la pantalla. Escribe el nombre que quieras (por ejemplo Comunicación o Noticias) y haz clic en Nombre. También puedes mover grupos completos de iconos en esta pantalla. A continuación, haz clic en cualquier parte de la pantalla Inicio para alejar. ¡Ya está! Ahora se muestra un nombre de grupo sobre el grupo de iconos recién creado.

Nuevos iconos

Cuando instalas un nuevo programa en tu equipo o tableta Windows 8, aparece automáticamente un nuevo icono en la pantalla Inicio. Puedes usar los procedimientos anteriores para personalizar el modo y el lugar en el que se muestra este icono en la pantalla Inicio. También puedes descargar nuevas aplicaciones a través de la Tienda de Windows 8: en la pantalla Inicio haz clic en el icono Tienda. Las aplicaciones disponibles se dividen en varios grupos: Juegos, Redes sociales, Entretenimiento, Fotografía, Música y vídeo, Deportes, Libros y consulta, Noticias y el tiempo, Salud y forma física, Alimentos y bebidas, Estilo de vida, Compras, Viajes, Finanzas, Productividad, Recursos, Seguridad, Empresa, Educación y Gobierno. Es muy sencillo instalar una aplicación. Por ejemplo, en el grupo Productividad, haz clic en la aplicación gratuita Escritorio externo. Se muestra una pantalla con información sobre esta aplicación. Haz clic en Detalles para obtener más información sobre el producto y leer las opiniones sobre esta aplicación de otros usuarios a través de Críticas. Si te gusta la aplicación, haz clic en Instalar a la izquierda de la pantalla. Es posible que se pidan los datos de tu cuenta Microsoft (por ejemplo, tu cuenta de Hotmail). Especifica estos datos y la aplicación se instalará en tu equipo. El icono asociado se mostrará en la pantalla Inicio. Es muy sencillo agregar nuevas funciones a tu equipo o tableta Windows 8.

Para terminar

Cuando termines de leer este artículo, conocerás todos los secretos de la pantalla Inicio. Disfruta personalizando tu equipo o tableta Windows 8.

Fuente: http://www.microsoft.com/business/es-es/Actualidad-pyme/Paginas/Article.aspx?cbcid=54

Animacion html5 y css3

Html5 y css3 presentan un inmenso mundo de posibilidades en la animación web. Multitud de propiedades que posibilitarán revolucionar el mundo visual de internet tal como lo conocemos ahora mismo. Evitando antiguas tecnologías como flash, silverlight... que requerían plugIn externos para su ejecución o que no permitían "acceder" a los navegadores a su información para SEO... Html5 nos brinda un mundo de oportunidades que podremos conocer de buena mano en el siguiente enlace:

http://animateyourhtml5.appspot.com/pres/index.html#1

¡¡Bienvenidos al maravilloso mundo del 3D!!
Animaros a probar y comencemos la revolución gráfica en internet


viernes, 8 de agosto de 2014

Ventanas modales usando solo CSS

Este articulo me ha sido de mucha ayuda. Esta muy bien redactado, explicando paso a paso el codigo y además el auto incluye en descarga el codigo fuente final. Muy recomendado.

Fuente: http://www.nosolocss.com/blog/css/crear-ventanas-modales-usando-solo-css-y-su-selector-target



Crear ventanas modales usando solo css y su selector target

ventana modal con css

Hace algún tiempo escribí sobre como crear ventanas modales con la ayuda de Jquery UI, y como técnica para salir del paso rápidamente no esta mal, pero no es la mejor manera de hacerlo, mas que nada porque estamos cargando una librería entera en nuestro proyecto para hacer algo que podríamos hacer solo con CSSAhora podrás pensar que tal vez sea demasiado pesado hacer esto usando solo CSS, o que los resultados no van a estar a la altura, pero lo cierto es que con las nuevas características de CSS3, se pueden obtener efectos sorprendentes con muy pocas lineas de código, y escasos o nulos conocimientos de programación.


La parte HTML para crear esta demostración sera algo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<ul>
    <li><a href="#modal1">DESLIZAR</a></li>
    <li><a href="#modal2">ROTAR</a></li>
    <li><a href="#modal3">REDIMENSIONAR</a></li>
</ul>
<div id="modal1" class="modalmask">
    <div class="modalbox movedown">
        <a href="#close" title="Close" class="close">X</a>
        <h2>DESLIZAR</h2>
        <p>La ventana modal aparece por arriba y se desliza hasta su posición. Un efecto simple pero elegante.</p>
        <p>Aquí puedes incluir cualquier cosa como vídeos, mapas, formularios...</p>
    </div>
</div>
<div id="modal2" class="modalmask">
    <div class="modalbox rotate">
        <a href="#close" title="Close" class="close">X</a>
        <h2>ROTAR</h2>
        <p>Usando la propiedad transform de CSS3, podemos hacer que las ventanas aparezcan rotando.</p>
        <p>No hay nada de Javascript, solo unas pocas lineas de CSS.</p>
    </div>
</div>
<div id="modal3" class="modalmask">
    <div class="modalbox resize">
        <a href="#close" title="Close" class="close">X</a>
        <h2>REDIMENSIONAR</h2>
        <p>También puedes redimensionar la ventana hasta hacerla desaparecer.</p>
        <p>Las posibilidades que ofrece CSS3 son múltiples, tan solo hace falta un poco de imaginación para crear efectos realmente llamativos.</p>
    </div>
</div>
La clase modalmask sera la encargada de aplicar el fondo oscuro, característico de las ventanas modales, mediante la superposición de un div que se extienda sobre el contenido. En el interior de este div incluiremos la ventana, a la que se le aplican otras 2 clases, una para darle estilo y otra para animarla. Dentro incluiremos otro enlace para crear el botón de cerrar y el contenido que mostrara la ventana.
Lo realmente importante aquí es el CSS. Lo muestro por partes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.modalmask {
    positionfixed;
    font-familyArialsans-serif;
    top0;
    right0;
    bottom0;
    left0;
    background: rgba(0,0,0,0.8);
    z-index99999;
    opacity:0;
    -webkit-transition: opacity 400ms ease-in;
    -moz-transition: opacity 400ms ease-in;
    transition: opacity 400ms ease-in;
    pointer-events: none;
}
.modalmask:target {
    opacity:1;
    pointer-events: auto;
}
En primer lugar el efecto modal, creado mediante  la superposición de un div semitransparente sobre todo el contenido, usando para ello  la propiedad z-index. Para ocultarlo establezco la opacidad a 0 y desactivo los eventos del puntero (pointer-events: none) para evitar que interfiera con la pagina estando oculto.
Para iniciar la animación y mostrar las diferentes ventanas modales hago uso del selector target de CSS3. Lo que hace este selector es modificar los estilos del div al que hace referencia un enlace. En este caso restablece la opacidad y reactiva los eventos del puntero para activar el efecto.
Una vez que tenemos la capa modal hay que dar forma a la ventana:
1
2
3
4
5
6
7
8
9
10
11
.modalbox{
    width400px;
    positionrelative;
    padding5px 20px 13px 20px;
    background#fff;
    border-radius:3px;
    -webkit-transition: all 500ms ease-in;
    -moz-transition: all 500ms ease-in;
    transition: all 500ms ease-in;
     
}
Y animar su aparición, aprovechando que el selector target también se puede usar con los elementos hijos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.movedown {
    margin0 auto;
}
.rotate {
    margin10% auto;
    -webkit-transform: scale(-5,-5);
    transform: scale(-5,-5);
}
.resize {
    margin10% auto;
    width:0;
    height:0;
}
.modalmask:target .movedown{       
    margin:10% auto;
}
.modalmask:target .rotate{     
    transform: rotate(360deg) scale(1,1);
        -webkit-transform: rotate(360deg) scale(1,1);
}
.modalmask:target .resize{
    width:400px;
    height:200px;
}
Como se puede ver sobre estas lineas, establezco en cada animación el estado inicial en la clase correspondiente, y el estado final al hacer target, es decir, los estilos que se aplicaran al pulsar el enlace de cada ventana modal.
Ya solo quedaría el CSS correspondiente al botón o enlace encargado de cerrar las ventanas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.close {
    background#606061;
    color#FFFFFF;
    line-height25px;
    positionabsolute;
    right1px;
    text-aligncenter;
    top1px;
    width24px;
    text-decorationnone;
    font-weightbold;
    border-radius:3px;
}
.close:hover {
    background#FAAC58;
    color:#222;
}
No tiene nada especial porque para hacer desaparecer las ventanas modales y sus estilos, bastara con cambiar eltarget a otro enlace, en este caso #close, que no aporta ningun CSS.


Conclusión
Como se puede ver, las nuevas características CSS cada vez están mas avanzadas y, combinadas con HTML5, nos permiten hacer cosas que antes solo podíamos implementar con Javascript y sus librerías, lo cual es una buena noticia para los desarrolladores, ya que nos va a suponer una reducción considerable en el tamaño de las web y una mejora en la accesibilidad de las mismas.
Por otro lado, ahora que lo pienso, con el selector target tenemos otra forma de simular un evento onclick, mejor incluso que aquella que compartí hace algún tiempo, basada en el uso de inputs tipo radio. Sin duda con este selector vamos a poder crear efectos asombrosos, yo ya tengo algunos en mente. ¿Y tu?

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...