Gadget para Windows Vista con Silverlight y que Permite Escritura a Mano y selección de colores.

Que tal, espero que estén muy bien, por mi parte, achaques de salud por la aproximación a mis 30 años, 6 de septiembre (por si alguien quiere saludar). Pero bueno, vamos a ver lo que nos convoca.

En el pequeño articulo Creando un Gadget para Vista y Silverlight, vimos lo básico para crear estos componentes para nuestra barra.  Ahora veremos como hacer un gadget que permita la escritura con el mouse o mejor aún para ser utilizado en tablet PC.

PANTALLA PRINCIPAL DEL GADGET

Elegir el PNG

Vamos a elegir  un buen png para el fondo de nuestro gadget, despues de poco buscar encontré esta imagen que me gusto :

image

Para esto, al igual que antes, vamos a utilizar Microsoft Expression Blend 2.0, también podemos probar el mismo (de forma de una página web normal) para ir depurando nuestro super gadget.

Diseño y Dimensiones.

Vamos a diseñar el gadget con dimensiones de ancho 130px y alto de 182px (recuerda que es un tamaño aceptable considerando que es un gadget sobre el sidebar).

image

El cuadro de es tipo InkPresenter que nos va a permitir la escritura en este cuadro de texto, además el fondo es «transparent». El código XAML de la página sería el siguiente:

<Canvas
      xmlns=«http://schemas.microsoft.com/client/2007«
      xmlns:x=«http://schemas.microsoft.com/winfx/2006/xaml«
      Width=«130« Height=«182«
      x:Name=«Page« Loaded=«root_Loaded« >
     <Image Canvas.Left=«-48« Width=«200« Height=«200« Source=«img/file.png« Stretch=«Fill« Canvas.Top=«-6«/>

     <InkPresenter
    x:Name=«CuadroTinta«
    Background=«transparent«
    Width=«130« Height=«182«
 
   MouseMove=«LapizMouseMove«
    MouseLeftButtonDown=«LapizMouseDown«
    MouseLeftButtonUp=«LapizMouseUp« Canvas.Top=«2«/>
</Canvas>

Creando el comportamiento del Gadget

Si analizamos un poco este código, nos damos cuenta que el elemento InkPresenter tiene seteado tres manejadores de eventos:

MouseMove=«LapizMouseMove«
MouseLeftButtonDown=«LapizMouseDown«
MouseLeftButtonUp=«LapizMouseUp«

Estas funciones son llamadas desde el Default.aspx la cual hace referencia al archivo tintas.js y que contiene:

// Captura la posición del mouse y crear el Stroke, con el color

function LapizMouseDown(sender,args)

{  inkPresenter.CaptureMouse();
   newStroke = silverlight.content.createFromXaml(‘<Stroke/>’);
   newStroke.StylusPoints.AddStylusPoints(args.GetStylusPoints(inkPresenter));

   newStroke.DrawingAttributes.Color = color;
   newStroke.DrawingAttributes.Width = 2;
   newStroke.DrawingAttributes.Height = 2;
   inkPresenter.Strokes.Add(newStroke);

}
// Mientras el mouse se va moviendo, vamos agregando puntos al stroke
function LapizMouseMove(sender,args)
{
   if (newStroke != null)
   {
      newStroke.StylusPoints.AddStylusPoints(args.GetStylusPointsinkPresenter));
   }
}

// Soltamos el boton del mouse
function LapizMouseUp(sender,args)
{
   newStroke = null;
}

PANTALLA DE SETTING

Diseño

Lo primero es crear los cuadros de colores, que servirán para que el usuario pueda seleccionar el color de la línea que desea dibujar, el texto tiene un pequeño efecto de «reflexión», este efecto se logra utilizando la herramienta flip  image y luego ocupamos el alpha en el texto (para que se vea borroso).  Los cuadros, tienen por nombre el color (en inglés) al cual representan, y esto tiene una razón de ser, debido a que vamos a utilizar el nombre de los cuadros como argumentos de funciones que setean los colores de la línea.

image

Las animaciones básicamente generan el aumento de tamaño de cada uno de los cuadros:

image

Recuerda utilizar el Copiar la animación y luego hacer la reversa, te ahorras bastante trabajo en los (On-Off)

Comportamiento de la Pantalla de Configuración

Recuerda que debes agregar las siguientes líneas en el archivo html que representa a la pantalla de inicio de gadget «Default.html»

System.Gadget.onSettingsClosed = SettingsClosed;
System.Gadget.settingsUI = «Setting.html»;

En el archivo Setting.XAML tenemos que cada cuadro llama llama a las funciones para crear la animación:

MouseEnter=«amarilloOn« MouseLeave=«amarilloOff« MouseLeftButtonDown=«amarilloClick«  Cursor=«Hand«>

 

Las Siguientes funciones sirven para activar las animaciones (…On) en el evento MouseEnter
// desactivar (..Off) activa la animación cuando se hace MouseLeave sobre el cuadro y
// (…Click) cuando se hace click sobre el cuadro.
// Para hacerlo más fácil los x:Name de los elementos tienen el nombre del color
// para que pasemos como argumento el Name del sender a la función marcador.

function negroOn(sender, args)
   {sender.findName(«negroOn»).Begin();  }

function negroOff(sender, args)
  {sender.findName(«negroOff»).Begin(); }

function negroClick(sender, args)
{marcador(sender.Name, sender);       }

y  las funciones adiciones  nos sirve para aumentar el borde del cuadro del color seleccionado para hacerlo más rápido en términos de programación, volvemos  el StrokeThickness de todos los elementos a 1, y luego cambiamos el StrokeThickness del objeto seleccionado. Con la línea  color=objeto seteamos la variable color para que cuando se ejecute la función asociada a onSettingsClosing se escriba en el gadget el valor del color seleccionado.

function marcador(objeto, sender) {
    sender.findName(«yellow»).StrokeThickness = «1»;
    sender.findName(«blue»).StrokeThickness = «1»;
    sender.findName(«red»).StrokeThickness = «1»;
    sender.findName(«black»).StrokeThickness = «1»;
    sender.findName(«green»).StrokeThickness = «1»;
    sender.findName(objeto).StrokeThickness = «3»;
    color = objeto;
}

Cuando se cierra la ventana, y es por que presionaron el botón Aceptar

System.Gadget.onSettingsClosing = function(event) {
    if (event.closeAction == event.Action.commit) {
        if (color != «») {
            System.Gadget.Settings.write(«color», color);
        }
        event.cancel = false;
    }
}

Recuerda también que cuando se cierra esta ventana, hay que pasar los valores para que se actualice el valor en la pantalla principal, es aquí en donde utilizamos la siguiente línea de código:

System.Gadget.onSettingsClosed = SettingsClosed;

Es decir, cuando se cierre la ventana de setting, se ejecuta la función SettingsClosed.

Finalizando

Una vez configurado el Manifiesto XML del Gadget solo nos queda ejecutar nuestro Gadget, te dejo algunas imágenes.

image  image image

Te dejo el Gadget para que lo descargues , si quieres ver los archivos y programación, tienes que ir a:

C:Program FilesWindows SidebarGadgetsTinta.Gadget 
( o Archivos de Programa, según el idioma de tu navegador)

DESCARGA EL GADGET ACA!! (QUE ES EL PROPIO CODIGO FUENTE, SI NO LO SABIAS)

Nada más que queda agradecerte es leer este artículo, como vez, se pueden lograr cosas interesantes mezclando tecnologías verdad?

Saludos,

Gonzalo

Controles Controles Controles…(Pensamientos)

Este post va a resultar un poco distinto a los demás, que generalmente son 100% técnicos( o pretenden serlo).  Una de las ventajas que tenemos con ASP.NET sobre otros lenguajes para desarrollo Web, es la gran cantidad de controles disponibles para que nos ahorremos trabajo, y por que no decirlo dinero. Alguien podría decir, «imposible que te ahorres dinero, esos controles valen dinero, y a veces mucho», pero justamente este es el punto, aprovechar controles ya desarrollados, y más cuando es una «suite», es obviamente una ventaja, re-inventar la rueda nunca ha sido productivo ni barato.

Mi suite preferida es TELERIK RadControls, una magnífica suite de controles para ASP.NET,

image Y como sus mismos creadores dicen
«More than 500 running demos for all controls. Source code viewer and ready-to-use Visual Studio projects provided. All examples are included in the RadControls distribution»

Nada que decir, solo que vayas a la ver los demos y te sorprendas pinchando aquí.

Personalmente, estoy muy conforme con el desempeño, usabilidad y documentación de estos controles. Puedes bajar una demo para que te convenzas de que es una excelente inversión.

Otros controles recomendados (Estos son Gratis!)

FCKEditor

Ahora bien, se agradecen mucho los controles gratis, un aplauso a los desarrolladores :), uno que ocupo mucho para las clásicas entradas de texto con formato por parte del usuario.

Totalmente configurable, muy flexible, compatible con ajax (con firefox tienes que hacer algunas modificaciones, pero funciona muy bien)

image

Completamente integrable con:

image 
Es posible configurar el Skin  con el que quieres visualizar el editor.

Ve el demo acá

LightBox JS

Quieres un efecto muy bueno sobre las fotos de tu galería de imágenes, o sobre una foto de una noticia que publiques ?, utiliza LightBox, un script de fácil uso y configuración que te permite efectos como el de la imagen.

image

Puedes configurar casi de todo, la velocidad de la animación, los textos para cerrar la imagen ampliada, y es muy fácil de utilizar. Click aquí para visitar el sitio

 Open Flash Art

Excelente componente para realizar gráficos generados con flash que incluyen animaciones, con una galería extensa de tipos de gráficos, muy buenos tutoriales sobre como utilizar la librería para generar los mismos, con los cuales puedes darle un toque superior a tus páginas. Revisa este componente aquí y un ejemplo sobre .NET aquí.

image image
image image

Espero escribir un articulo sobre Open Flash Art en Español, espero que te haya sido útil esta información y gracias por leer este artículo. 🙂

Saludos,
Gonzalo

Creando un Gadget para Vista con Silverlight

Ya sabemos que los Gadget para Windows Vista son relativamente sencillos de crear, de hecho puedes descargar un video como desarrollar uno acá. Ahora bien, si construir un Gadget es similar a crear una página web, entonces, por que no, probar con Silverlight, de manera de poder integrar XAML al Escritorio.


El primer paso es construir en Expression Blend el diseño, con las dimensiones  alto:130px y ancho: 130px. (Tamaño aceptable en el sidebar). Vamos a ocupar un fondo con cierto degradado y además vamos a utilizar un png.


Luego, vamos a crear una animación , simplemente girar y aumenta el tamaño del png, para cuando el usuario coloca el cursor del mouse sobre el gadget, y otra animación, reversando para volver al estado original.



Recuerda, para que te sea más fácil, seleccionar la opción «Duplicate»  y luego aplicar «Reverse».


image


Con esto tenemos dos animaciones una que se llama «on» y otra que se llama «off» las que serán invocadas desde javascript del archivo Default.html (Recuerda que tienes que setear el archivo gadget.xml para que sea el cuerpo de gadget)


            <base type=«HTML« src=«Default.html« />


Y las funciones de Javascript para llamar a las animaciones son:

<script language=»jscript»>

function on(sender, args) {
    sender.findName(«on»).begin();
}
function off(sender, args) {
    sender.findName(«off»).begin();
}
</script>


y las llamadas a estas funciones en el archivo XAML:

<Canvas
      xmlns=«http://schemas.microsoft.com/client/2007«
      xmlns:x=«http://schemas.microsoft.com/winfx/2006/xaml«
      Width=«130« Height=«130« x:Name=«Page« MouseEnter=«on«  MouseLeave=«off« mlns: Microsoft_Expression_DesignModel_Platform = «clr-namespace: Microsoft. Expression. DesignModel. Platform; assembly= Microsoft.Expression.DesignModel«>

Nuestra carpeta, que sería :
C:Program FilesWindows SidebarGadgetsBatterySL.Gadget
Debería ser algo así:


image


Luego, abrimos la ventana para agregar nuevo gadget. y lo arrastramos a nuestro Sidebar









 
image image

Si apretamos botón derecho sobre el gadget veremos el mensaje:


image


El gadget que construí no puede ser más inútil, a no ser que te guste ver girar imágenes, pero es para mostrarte como lo puedes construir.


Te dejo el gadget para que lo descargues desde acá, recuerda que para ver los archivos sin instalarlo puedes cambiar la extensión del gadget de «.Gadget» a «.zip».

[Tips]Exportar GridView a Excel (Sin Paginación) …al fin

    El cambio de esto en relación a un post pasado que lo puedes ver acá, es que se instancia un nuevo objeto gridview, el cual puedes customizar a tu gusto, de esta manera no dependes de la paginación seteada de la grilla original :),  como en el siguiente ejemplo, podemos dejar Visible=False una columna.

Nota: LoadData2() es un método que devuelve un DataTable.

        Dim sb As StringBuilder = New StringBuilder()
        Dim sw As StringWriter = New StringWriter(sb)
        Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
        Dim pagina As Page = New Page
       
Dim grilla As New GridView
       
grilla.EnableViewState = False
       
grilla.AllowPaging = False
        grilla.DataSource = LoadData2()
        grilla.DataBind()
        ‘grilla.Columns(0).Visible = False
 
       Dim form = New HtmlForm
        pagina.EnableEventValidation = False
       
pagina.DesignerInitialize()
       
pagina.Controls.Add(form)
        form.Controls.Add(grilla)
        pagina.RenderControl(htw)
        Response.Clear()
        Response.Buffer = True
        Response.ContentType = «application/vnd.ms-excel»
        Response.AddHeader(«Content-Disposition», «attachment;filename=data.xls»)
        Response.Charset = «UTF-8»
        Response.ContentEncoding = Encoding.Default
        Response.Write(sb.ToString())
        Response.End()

Espero que les sea útil, ya que varias personas me habían solicitado esta info, disculpen la demora!

Saludos,
Gonzalo

Tutorial Silverlight 1.0 con ejemplo práctico.

Pincha aquí para ver el resultado, para ver si te animas a seguir.

Hola que tal, les dejo un tutorial del Silverlight 1.0, con un ejemplo práctico, algunos podrían decir "por que de 1.0 si ya estamos a puertas de la versión 2 definitiva", primero que nada, SL 1.0 apunta a otro tipo de aplicaciones, solo con programación del lado del cliente, por lo que si queremos hacer un banner o algún tipo de publicidad, etc, para que vamos a hacer que el usuario descargue 4.6 Mb solo para ver un aviso!, es descabellado. Pero bueno, veamos el caso práctico.

Tenemos el siguiente caso:

Una pequeña publicidad en donde el usuario puede arrastrar el color al Auto(un Peugeot 206, que es el que tengo, jejej) y la imagen del 206 cambiará de color. Además el muchacho (o muchacha, en realidad no sé), va a pestañear cada 6 segundos, los cuales podrían ser aleatorios.

La siguiente imagen ilustra el cambio de color del auto,

image
image  

Diseño

Para la construcción, lo primero fue pensar en el diseño, si bien no quedó muy bonito, (se hizo lo que se pudo!). Utilizaremos Microsoft Expression Blend , el CTP de Junio 2008 que lo puedes descargar de aquí. En realidad, si tienes el ctp de marzo, para este ejemplo da lo mismo, ya que no ocupamos nada nuevo de SL 2.0.

Lo primero es agregar al proyecto las imágenes  que vamos a utilizar, las cuales son:

image

Estas Imágenes nos van a permitir realizar el efecto de cambiar el color del auto según lo seleccionado por el usuario, además, si te fijas, existen dos imágenes con la cara del tipo que nos indica que hacer, esto es por que vamos a conseguir el efecto de "pestañeo" del tipo.

Luego vamos a diseñar con las figuras poligonales que nos ofrece ExpBlend el título y la paleta de colores, si te das cuenta el fondo, al igual que el titulo tiene un fondo degradado, esto se logra con las propiedades de "Brushes" en la barra de propiedades de un objeto.

La barra de colores, tiene algunas particularidades que tenemos que revisar.

Barra de Exploración de objetos Diseño de la Paleta
image

image

Podemos notar que existen cuadros de colores llamados color_fijo y color_movil, por cada uno de los colores, ahora bien, el cuadro de color fijo esta exactamente bajo el cuadro móvil ( te puedes fijar en las posiciones para comprobarlo) y esto tiene una razón de ser, cuando arrastramos el cuadro hacia el auto, debemos dejar una copia del cuadro en su posición, para que no quede el lugar vacío.

Con cuadro fijo de fondo Sin cuadro fijo de fondo
image image

Esta paleta de colores esta agrupada en un Canvas, por lo que va a afectar el calculo de la posición para determinar si el cuadro que se está arrastrando está efectivamente sobre el auto. Ya que los objetos contenidos en un canvas tienen sus propiedades atachadas, canvas.top y canvas.left en relación al canvas en donde están contenidos y no a todo el canvas principal.

image
Para el calculo de las posiciones a nivel del Canvas principal, vamos a tener que hacer referencia a posiciones negativas (sobre el canvas paleta)

Codificación.

1. Pestañeo

Primero veamos los ojos y como vamos hacer que el cristiano pestañee, la idea es que cada cierto tiempo se haga una sustitución de imagen. ( ojosOn = Ojos Abiertos,  OjosOff = Ojos Cerrados). Entonces lo que en realidad necesitamos es llamadas a funciones de ojosOn y ojosOff cada cierto período de tiempo, por lo que tenemos:

function ojosOn(){
document.getElementById("SilverlightControl").content.findName("cara").Source="caras/LinkPH.png";
    setTimeout("ojosOff()", 6000);
 
}

function ojosOff(){                            document.getElementById("SilverlightControl").content.findName ("cara").Source="caras/LinkPH3.png";
  setTimeout("ojosOn()", 300);
}

Teniendo en cuenta que:
LinkPH.png  =>Imagen ojos Abiertos
LinkPH3.png =>Imagen ojos Cerrados.

Tenemos que recordar que podemos hacer referencia a un objeto dentro del XAML con:
document.getElementById("SilverlightControl").content.findName (NombreDelObjeto).propiedad;

Por lo que vamos cambiando la propiedad source para hacer la sustitición.
Podemos darnos cuenta que utilizamos la función setTimeout para llamar a cierta cantidad de milisegundos una función u otra, esto nos permitirá hacer el efecto de pestañeo. La llamada por primera vez a la función ojosOn esta en la declaración del Canvas Principal:

<Canvas
      xmlns="http://schemas.microsoft.com/client/2007"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Width="619" Height="338"
      x:Name="proyecto" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Loaded="ojosOn">

2. Drag & Drop y cambio de Color del Auto.

Ahora que sabemos como cambiar las imágenes haciendo referencia al atributo Source de un objeto imagen, ya nos imaginamos como ocurre el "mágico cambio de color del auto".

El código para hacer Drag&Drop es un código más bien genérico para este propósito, un poco modificado para poder determinar , una vez que dejen de arrastrar el cuadro y se libera el botón del mouse (MouseLeftButtonUp), la posición en donde esto ocurrió, si esta dentro del perímetro de la imagen del auto, se cambia de color. Revisemos el código:

var beginX;
var beginY;
var trackingMouseMove = false;

 function onMouseDown (sender, mouseEventArgs)
     {   sender.Visibility="Visible";
         beginX = mouseEventArgs.getPosition(null).x;
        
beginY = mouseEventArgs.getPosition(null).y;
         sender.Opacity = .5;
       
 trackingMouseMove = true;
        
sender.captureMouse();

    }

function onMouseMove (sender, mouseEventArgs)
    {   sender.Visibility="Visible";
        if (trackingMouseMove == true)
         {
          var actualX = mouseEventArgs.getPosition(null).x;
          var actualY = mouseEventArgs.getPosition(null).y;
          sender["Canvas.Left"] += actualX – beginX;
          sender["Canvas.Top"] += actualY – beginY;
          beginX = actualX;
          beginY = actualY;
                }
      }

function onMouseUp (sender, mouseEventArgs)
     {   sender.releaseMouseCapture();
        
trackingMouseMove = false;
        
switch(sender.Name){
               case "black_movil":
                 var imagen="img/peugeot_206_black.png";
                 checkinside(sender,‘_206’,imagen);
                 sender["Canvas.Top"]="14";
                 sender["Canvas.Left"]="12";
               break;
               case "celeste_movil":
                   var imagen="img/peugeot_206_blue.png";
                   checkinside(sender,‘_206’,imagen);
                   sender["Canvas.Top"]="14";
                   sender["Canvas.Left"]="84";
               break;

               case "blanco_movil":
                  var imagen="img/peugeot_206_grey.png";
                  checkinside(sender,‘_206’,imagen);
                  sender["Canvas.Top"]="14";
                  sender["Canvas.Left"]="157";
               break;
               case "naranjo_movil":
                    var imagen="img/peugeot_206_orange.png";
                    checkinside(sender,‘_206’,imagen);
                    sender["Canvas.Top"]="14";
                    sender["Canvas.Left"]="228";
              break;
              case "rojo_movil":
                    var imagen="img/peugeot_206_red.png";
                    checkinside(sender,‘_206’,imagen);
                    sender["Canvas.Top"]="14";
                    sender["Canvas.Left"]="300";
               break;
             }
            }

   function checkinside(sender,element,imagen)
 
{
   if (((sender["Canvas.Top"]>-180)&&(sender["Canvas.Top"]< -68))&&((sender["Canvas.Left"]> 61)&&(sender["Canvas.Left"]< 252)))
    {
   
  sender.findName(element).Source=imagen;
 
  }
  }

Y las llamadas a las funciones en el código XAML:

<Rectangle MouseLeftButtonUp="onMouseUp" MouseLeftButtonDown="onMouseDown" MouseMove="onMouseMove" Width="68" Height="57.709" Fill="#FFBCCDDF" Stroke="#FF000000" RadiusX="14.5" RadiusY="14.5" x:Name="blanco_movil" Canvas.Left="157" Canvas.Top="14"/>

            <Rectangle MouseLeftButtonUp="onMouseUp" MouseLeftButtonDown="onMouseDown" MouseMove="onMouseMove" Width="68" Height="57.709" Fill="#FFE47827" Stroke="#FF000000" RadiusX="14.5" RadiusY="14.5" x:Name="naranjo_movil" Canvas.Left="228" Canvas.Top="14"/>

            <Rectangle MouseLeftButtonUp="onMouseUp" MouseLeftButtonDown="onMouseDown" MouseMove="onMouseMove" Width="68" Height="57.709" Fill="#FF4C80BA" Stroke="#FF000000" RadiusX="14.5" RadiusY="14.5" x:Name="celeste_movil" Canvas.Left="84" Canvas.Top="14" RenderTransformOrigin="2.015,0.606"/>

            <Rectangle MouseLeftButtonUp="onMouseUp" MouseLeftButtonDown="onMouseDown" MouseMove="onMouseMove" Width="68" Height="57.709" Fill="#FFEE470D" Stroke="#FF000000" RadiusX="14.5" RadiusY="14.5" x:Name="rojo_movil" Canvas.Left="300" Canvas.Top="14"/>

            <Rectangle MouseLeftButtonUp="onMouseUp" MouseLeftButtonDown="onMouseDown" MouseMove="onMouseMove" Width="68" Height="57.709" Fill="#FF595D63" Stroke="#FF000000" RadiusX="14.5" RadiusY="14.5" x:Name="black_movil" Canvas.Left="12" Canvas.Top="14"/>

El código no es tan extenso :), lo hacemos es en la función onMouseUp es determinar el nombre del sender, es decir, del objeto que se está arrastrando (cuadro_movil). Entonces, como decíamos, determinamos el nombre del objeto y lo sometemos a evaluaciones con switch, y dependiendo del caso, seteamos la variable imagen con la ruta que corresponde a la imagen del auto según el color, luego llamamos a la función checkinside, con los tres argumentos, sender, element e imagen. Sender es el objeto que se arrastra y lo ocupamos para comprobar la posición (aquí se ve que se hacen comparaciones a posiciones negativas), element, que hace referencia a la imagen _206 y e imagen, que tiene la ruta de la imagen.

Una vez que determinamos si está o no dentro de la imagen, devolvemos el cuadro a su lugar, para que no quede sobre la imagen del auto (función onMouseUp).

Como vez, no es difícil y se logra un efecto interesante!

Ve el resultado de este ejemplo aquí

Baja el código aquí

Espero que te haya servido!, se agradecen los comentarios!!! 😛
Saludos,
Gonzalo

Listar Archivos de una carpeta con LinQ y ASP.NET

Algunas veces debemos listar el contenido de una carpeta del servidor en nuestras intranets, por distintos motivos. Ahora que existe LinQ , a mi parecer es mucho más cómodo e intuitivo.

Para el ejemplo, vamos a tener un dropdownlist que va a contener una lista de todas las extensiones de archivo que hay en la carpeta, además un GridView que va a contener una lista con la info de los archivos cuya extensión coincide con lo seleccionado en el dropdownlist.

Partamos por el «Diseño», que es simplemente aplicar un autoformato sobre el GridView 🙂 y el dropdownlist tiene la propiedad autopostback=true

Espacio de Nombres:

Imports System.Linq
Imports System.IO

Diseño:

image 

Ahora veamos el código asociado al iniciar el formulario.

Código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not Page.IsPostBack Then

Dim tipo= From archivo In Directory.GetFiles(«/») _
          Let extension = New FileInfo (archivo).Extension _
          Select Ext = extension, _
                 descripcion = «Archivos « & extension _
         
Distinct

For Each f In tipo
     filtro.Items.Add(New ListItem(f.descripcion, f.Ext))
Next

End If
End Sub

Algunos puntos que debemos ver de este código que sirve para listar en el dropdownlist que se llama filtro. Primero, hacemos la consulta sobre la coleccion que devuelve GetFiles de mi carpeta raíz, luego utilizo Let para setear la variable extension. Hay que tener en cuenta que si asignas a una variable un valor por medio de Let , ya no vas a poder asignarle nuevamente otro valor, es decir, solo una vez puedes asignarle un valor por este medio. Ya que podemos tener varios archivos con la misma extensión, ocupamos Distinct para que solo nos traiga una ocurrencia de «registros». Como vez es lo mismo que ocupar Distinct en una variable SQL.

Protected Sub filtro_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles filtro.SelectedIndexChanged

Dim archivos = From archivo In Directory.GetFiles(«/») _
Where Me.filtro.SelectedValue = New FileInfo(archivo).Extension _
Select Nombre = New FileInfo(archivo).Name, _
        FechaCreacion = New FileInfo(archivo).CreationTime, _
        Carpeta = New FileInfo(archivo).DirectoryName, _
        Extension = New FileInfo(archivo).Extension

Me.listado.DataSource = archivos
Me.listado.DataBind()
End Sub

En este código hacemos la consulta que nos trae la información de los archivos cuya extensión coincide con la selección del dropdownlist. Ocupamos Where  para filtrar por la extensión sobre la misma colección y obtenemos la info de los archivos. Luego bindeamos la colección genérica archivos.

image

Y logramos lo que queríamos, espero que te siva!.

Te dejo acá el link el skydrive para que bajes el código.

Nos vemos y gracias por leer este post!.

Gonzalo

Serie de ScreenCast

Que tal?
En esta sección voy a ir publicando una serie de ScreenCast que he hecho con tips y sobre ASP.NET, Silverlight, Gadget entre otros,espero que sea de vuestro agrado!

     Los videos están almacenados en SkyDrive, utilizalo tu también!

 

Introducción a Silverlight 1.0
Un pequeño recorrido para mostrar como crear un proyecto el Silverlight 1.0 con Microsoft Expression Blend 2.5.

Descargar fichero (3,14 Mb – 02:53 min)

   
Introducción a Silverlight y Scripting – Parte 1
Conceptos básicos para crear un proyecto de Silverlight 1.0 e interacción con Javascript.

Descargar fichero (4,24 Mb – 03:20 min)

   
Introducción a Silverlight y Scripting – Parte 2
Llamada a eventos desde Silverlight  y desde el HTML DOM.  Todo programado con Javascript.

Descargar fichero(4,76 Mb – 03:20 min)

   
Silverlight y Animaciones (05:01 min)
Rápida guía para crear animaciones y llamarlas desde Javascript según un evento determinado.

Descargar fichero (4,76 Mb – 03:20 min)

   
Imagen de Sustitución con Silverlight
Screencast que indica como crear una imagen de sustitución (rollover) con Silverlight y Javascript

Descargar fichero (5,1Mb – 03:74 min. )

 

 

Exportar una Grilla a Excel
Como exportar una Gridview a Excel. ( De un artículo del blog)

Descargar fichero (3,75 Mb – 03:09 min.)

   
Utilizando MasterPages (Antiguo- 2005)
Utilizando masterpages y haciendo referencia desde la master a la página hija.

Descargar fichero (6,21 Mb – 07:14 min.)

   
Como utilizar el control Multiview(Antiguo- 2005)

Descargar fichero (2,47 Mb – 03:05 min.)

 

Windows Vista Sidebar – Gadgets

Creación de un Gadget para Windows Vista Sidebar
Creación de un Gadget para Windows Vista, paso a paso, este ejemplo muestra un medidor de los rendimientos de los núcleos de un CoreDuo.

Descargar fichero (38,8 Mb – 26:40 min)

 

Microsoft Ajax Library con PHP
La biblioteca de AJAX de Microsoft es una biblioteca de Javascript puro, que es utilizada por AJAX de ASP.NET pero está también disponible para su descarga separadamente. Porque es Javascript puro, no se ata a ASP.NET exclusivamente. PHP para MS AJAX es código para ayudarte a hacer uso la biblioteca de AJAX de Microsoft con tus desarrollos en  PHP.

Descargar fichero

[Tips] LostFocus en ASP.NET

Siguiente la abandonada serie de Tips de ASP.NET vamos a ver como simular el evento lostfocus del lado del servidor con el onBlur de javascript. 

En este caso tenemos un UpdatePanel, dentro de él, un TextBox y un Labe.

image

El tema es simple, registramos en el textbox1, en su evento onblur, una llamada a la función __doPostBack, y utilizamos el objeto Label (podríamos ocupar el mismo textbox). Entonces, al gatillar del lado del cliente el evento  onBlur, se hace la llamada a dicha función, se hace la llamada asíncrona y se logra el efecto.

Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load

If Not Page.IsPostBack Then
  
TextBox1.Attributes.Add(«onblur», «setTimeout(‘__doPostBack(‘Label1′,»)’, 0);»)
Else
‘En este caso exponemos el mensaje de lostfocus siempre y cuando  ‘se haya ingresado algún texto dentro del textbox, si quieres que  ‘siempre muestre el mensaje en el lostfocus solo quita la ‘validación
   If Not String.IsNullOrEmpty(TextBox1.Text) Then
      Me.Label1.Text = «Hice LostFocus»
   End If
End If
End Sub

image

Espero que les sirva!

Saludos,

Gonzalo

ASP.NET Dynamic Data Web Site ( O enviar para la casa al developer que hace los mantenedores :P )

Hace un tiempo hizo su aparición Dynamic Data Web Site, como parte de ASP.NET 3.5 Extensión y me ha llamado bastante la atención, más que nada por las posibilidades que nos brinda, no voy a entrar en detalles, ya que para eso, les pido que visiten www.asp.net.  Revisando esta nueva tecnología, es que quiero compartir mi experiencia,

 

1) Seleccionando el Template Dynamic Data Website, que como decíamos vienen el con ASP.NET 3.5 Extensions Preview, en mi caso, el code behind en VB.NET 🙂

image

 

Paso siguiente, utilicé la archi-conocida base de datos Northwind, para luego crear agregar un Ítem «LINQ to SQL Classes»  , y arrastramos las tablas desde nuestro server explorer a el área de trabajo de datac.dbml

 image

 

En la siguiente imagen vemos las tablas de Northwind mapeadas a clases.

image 

Nuestro solution Explorer se verá como el siguiente, donde tenemos la carpeta App_Shared ,en la cual encontraremos las plantillas que nos permitirán navegar entre nuestras trablas.

image

 

Algo super importante es modificar el web.config de tal manera que:

<dynamicData dataContextType=«» enableTemplates=«true«>

<mappings queryStringKeyPrefix=«»  pattern=«~/{table}/MiEjemplo/{viewName}.aspx«>

<add actions=«list,details« viewName=«Detalle« templateFile=«ListDetailsTemplate.aspx«/>

 

enableTemplates=«true«: nos permita trabajar con las plantillas mencionadas.

pattern=«~/{table}/MiEjemplo/{viewName}.aspx« : nos indica cual va a ser el patron que va seguir nuestra URL para la navegación fíjate que hice un pequeño cambio, para el ejemplo.(MiEjemplo)

 viewName=«Detalle«: vamos a poder setear el nombre que aparecerá en la URL cuando estemos viendo el detalle de una tabla.

Importante es remarcar que podemos modificar el template «ListDetailsTemplate.aspx» así como también la MasterPage para que tenga un look&Field más «amistoso» a nuestra organización. Al iniciar nuestro proyecto obtendremos una lista con links a las tablas que estaban mapeadas.

 

image

Fijándonos en la URL podemos revisar que está funcionando nuestro seteo del web.config sobre el pattern, y lo que esta muy cool, fíjate que en Categorías no solo se muestra la foreing key, si no la relación realizada. Desde cada página puedes agregar,modificar y eliminar  registros.

image

Si tratas de hacer modificar o insertar un valor cuyo tipo de dato es incorrecto (según la BD) , se levantará un error que se te enviará a pantalla(todo esto es configurable con los templates)

image

Es más, si quieres crear nuevas reglas de validación, puedes ir al codebehing del item LINQ to SQL Classes, y comenzamos a modificar las métodos de las clases, para el ejemplo, vamos a modificar en datac.designer.vb la clase Product, para que cuando se desee cambiar el nombre del producto y si este es menor de 5 caracteres, se levante una exception.

 

<Table(Name:=«dbo.Products»)> _

Partial Public Class Product

Private Sub OnProductNameChanging(ByVal value As String)

        If value.Length < 5 Then

            Throw New Exception(«Debe Ingresar valores mayores a 5 Caractéres»)

        End If

    End Sub

 

image

Nada de mal? con un esfuerzo mínimo, el paso siguiente customizar el template por tabla, cambiar los css, la MasterPage, de hecho si van a www.asp.net verán como se puede customizar los controles para la manipulación de los datos, con controles ajax por ejemplo y se ve muy cool!

Espero que les haya servido, nos vemos!

Gonzalo

Etiquetas de Technorati: ,

Cells on Camp Chile!! Imperdible!!

REGISTRATE! NO TE PIERDAS ESTA OPORTUNIDAD

Lunes, 05 de mayo de 2008 9:00 – lunes, 05 de mayo de 2008 19:00
Hora de recepción: 9:00

Instituto Profesional Santo Tomas

Avenida Prat 855
Concepción Bío-Bío Chile

Información general del Evento

9:00 a 9:30  Registro General

9:00 a 9:45  Bienvenida a Cell on Camps

9:45 a 11:15 Novedades de Visual Studio 2008
  Microsoft Visual Studio 2008, es una de las herramientas mas completas en el desarrollo de aplicaciones .Net, con una gran cantidad de controles prácticos pragmáticos y de fácil utilización con múltiples integraciones a otras plataformas Ms.En esta sesión se mostrarán novedades de Visual Studio 2008 tanto en el IDE, novedosos controles soporte para LinQ, integración con Silverlight y generación de cuentas con Live.
  Orador: Luis Silva   PROYECT MANAGER  Microsoft Latam   , MVP, MCP y MCTS

11:30 a 13:00  ASP.NET MVC.
  ASP.NET MVC es un nuevo framework de desarrollo de aplicaciones WEB con tecnología ASP.NET, desarrollado por Microsoft y disponible como código fuente en http://www.codeplex.com/aspnet/ . El framework promueve el desarrollo por capas y la separación de responsabilidades de estas capas, siguiendo los principios tradicionales del conocido patrón de diseño modelo-vista-controlador. En esta charla estaremos mostrando sus principales componentes como vistas, rutas siguiendo esquema REST y las principales aéreas de extensibilidad de este framework.
  Orador: Alejandro Pacheco, Gerente de Relaciones Académicas, del Grupo de arquitectura y desarrollo de Microsoft Cono Sur

14:30 a 16:00  Introducción a Silverlight 2.0
  Microsoft Silverlight es un plug-in ejecutable en diferentes browsers, plataformas, o dispositivos que permite crear una nueva generación de aplicaciones ricas para la Web.En esta sesión repasaremos la nueva versión de Microsoft Silverlight, incluyendo la integración de la Base Class Library dentro del nuevo plug-in, el soporte para LINQ, el acceso a servicios Web desde el browser, la API DOM para manejo de HTML enriquecido, y la creación de animaciones dinámicas mediante código manejado.
  Orador: Gonzalo Pérez C. MVP ASP.NET/ASP, MCPD
16:00 a 17:30 Charlas Simultaneas

  1)Protegiendo el acceso a las redes con NAP
   Network Access Protection (NAP) es una potente herramienta disponible con  Windows Server 2008 que nos ayuda a proteger la red contra malware y otras amenazas. Se explicaran las nuevas capacidades del role de  «Network Policy Sever» y como se puede usar NAP para obligar a cumplir una serie de requisitos en cuestiones de seguridad a los equipos que se quieran conectar a nuestra red.
   Orador: Pablo Campos S.  Microsoft Certified Professional
  2) Desarrollo con XNA – CELL DUOC
  3)Iniciándose en  Silverlight  1.0  CELL UAMERICAS
  4) Diseñando con Microsoft Expression Desing y Expression Web (Roberto Alvarez, Diseñador Web)

17.30 a 18.30 Programa Académico y Células Académicas
  Presentación de Grupos y cómo crear una célula Microsoft.

18.30 a 19:00 Sorteos y Regalos