control Tab en ASP.NET (ultimo post del anio)

holas!


son las 1:34 p.m. aproximadamente en Perú del 30Dic, a un día de acabar el año. Y al parecer este será el último post del anio, nunca había cerrado un anio posteando (H).


Al tema del post, los que han tenido la oportunidad de usar CS, Community Server, al editar un post han tenido la facilidad de navegar sobre tabs, esto es ideal para no recargar el contenido de una página. Lamentablemente este control no está implementando (built-in) en ASP.NET, pero hay tips para usar un control de estos. Aunque también existen otros controles pagados.


Básicamente el artificio se encuentra en usar dos controles, digamos tres, un control Menu y un control Multiview, el cual debe contener controles View. El chiste sólo consiste en poner el Menu sobre el Multiview, y cada control View será una pestaña.


La base es el siguiente artículo. Personalmente he modificando algunas cosas para adaptarlo a mis necesidades.


Esta es la presentación que tengo:




  • Para lograr esto, tenemos que hacer una imagen (dos, un de select y otro de unselect) por cada tab, en el artículo original había un mismo dibujo para todas las pestañas.
  • Otra cosa que cambie, fue el estilo de las tablas de cada tab, para se adecue a mi modelo. Tenia una alineación con posición absolute, cosa que no encuentro como me sirve. Lo que si he perdido es el efecto de que el borde este detrás de la imagen, en el artículo original si tiene ese efecto :(, pero ya estoy en la búsqueda de la solución :P.
  • Ahora, si cada menú tiene una imagen el código de selección también cambia, por cierto en el artículo original estaba en VB, y me tome la molestia de pasarlo a C# xD:


protected void mnuTab_MenuItemClick(object sender, MenuEventArgs e)
{
   int valMenu = int.Parse(e.Item.Value);


   mviewPropuesta.ActiveViewIndex = valMenu;

   for (int i=0; i < mnuTab.Items.Count; i++ )
   {

        mnuTab.Items[ i].ImageUrl = “~/images/” + 
             ((i == valMenu) ? “pro_selectedtab” : “pro_unselectedtab”) +
             “0” + (i+1).ToString() + “.gif”;
   }
}



  • Otro problema que surge al hacer postback es que se pierde la posición del scroll, bueno esto depende del tamaño y estructura de tu site, para solucionar eso usamos la propiedad MaintainScrollPositionOnPostback=”true”, aunque todavía no me convence en mi escenario, cumple su objetivo :).
  • Obviamente que si a esto, le metemos AJAX, le daremos una mejor experiencia al usuario, pero en cuanto a funcionalidad, este artículo sirve como base.

Espero que pasen un feliz anio,  salud por el anio 2006 que se va, y salud por el anio que viene, que sea exitoso para todos :).


Saludos,


Post cruzado

iniciando un valor enum a null? ( .NET)

Es de hecho que muchas veces usaremos enum, para grupos de código, y es una buena práctica hacerlo. Y es que es útil a simple vista, cuando usamos un mensajes en Windows Forms, con la enumeración MessageBoxButtons, elegimos cuantos botones deseamos que tenga la ventana de diálogo. Además que también sirve como filtro y ayuda a protegerse de un input indeseado del usuario. También hay la opción de que un valor de una enumeración tenga opciones múltiples, lo hace manejandolo como bits, para eso usamos el atributo Flags.

Ahora pero que pasa si quiere iniciar la variable enum en null, y es lo mismo que pasa cuando queremos iniciar una fecha en null. Sobre todo en el manejo de capas, para pasar variables entre capas muchas veces se debe colocar una fecha a la mala, aunque no uses la variable y aunque no es un problema no es lo ideal.

Y es así que surgen nullable types, en un post anterior ya hemos hablado de ellos. Ahora, como usamos los nullable types en el manejo de capas, pues lo pueden encontrar usando el Web Service Software Factory. En gotdotnet podemos encontrar unos HOLs de como usar el Service Factory.

Ah por cierto si comparamos un tipo valor con null, siempre será falso, ya que un tipo valor nunca es null. Es por eso que se hace necesario el usar nullable types. También se puede usar struct con nullable, pero hay unos artificios que tienes que hacer.

Ahora veamos como lo usaría la enumeración Mes:

   Nullable<Mes> m2 = null;
   Console.WriteLine(“m2 {0}”, (m2.HasValue) ? “no es nulo” : “es nulo”);

   m2 = Mes.Febrero;
   if (m2 != null)
   { 
      Console.WriteLine(“el valor de m2 es: {0}”, (int)m2);
   }

Obviamente que una enumeración Mes, parece del curso de estructura de datos, pero ya en un ambiente real, podríamos usar una enumeración para un post o noticia, es decir noPublicada, Publicada, Spam, etc. De esa manera en todo mi sistema de capas no tengo porque recordar que código era el estado de noticia publicada, para eso uso una enumeración. Pero al final en la base de datos lo que quiero es el código es decir el (int).

Saludos,

Post cruzado

usando Data Access Application Block en la capa de Acceso a Datos (DataAccess)

en primer lugar quisiera opinar sobre este post de  Luis Ruiz Pavon, y sobre todo en los comentarios ahí vertidos. Y estoy totalmente de acuerdo, con algunos, como por ejemplo que no hay que usar algo porque está de moda, sino porque realmente nos es útil en el proyecto, nos hace más productivo, entendemos el código más rápido ya que está dividido en capas, pero también es obvio como comentaba un usuario, si estás en un proyecto de 12 a 18 meses, y en medio proyecto sale una nueva monería para el uso del proyecto, pues la decisión de cambiar es un riesgo, que el arquitecto de la solución deberá tomar. Y es así que entiendo y partiendo como premisa, el arquitecto de solución deberá analizar, y reanalizar bien la solución planteada. Y esto debe ser así, para proyectos grandes, y para proyectos con infraestructura compleja, integrar varios servidores, escoger un buen protocolo de transporte, orquestar todo eso… y todo lo demás que se fuman los arquitectos. Pero hay proyectos de no tan larga duración ni estructura tan compleja, que algunas veces no se incluye un arquitecto en el equipo, y en este caso se debería medir la utilidad, productividad del modelo en capas, y esta demás que si nunca hemos usado un modelo, a mi parecer el modelo en capas nos caería muy bien para empezar.

Ahora en cuanto  a la capa de acceso a datos, esta es importantísima, y si se ha usado un bueno modelo, es decir que tenga el mejor rendimiento, el mejor control de excepciones, escalabilidad, entre otras cosas, no habría porque hacerle una migración por la salida de un nuevo juguete para el acceso a datos. Y si hemos usado un bueno modelo, esa capa se puede mantener, y sólo cambiar la demás capas, por ejemplo para cambiar de Win, a Web, a VSTO, a WPF. Y si nuestra arquitectura debe evolucionar por el crecimiento de la organización, y debemos exponer nuestro negocio a través de servicios (SOA), ya sea usando WS o ahora WCF, podemos reutilizar ahí nuestra capa de acceso a datos. Imagino que en el futuro además del modelo de capas, y de SOA, habrá una nueva evolución, y espero que nuestra capita de acceso a datos se siga usando :).

Patterns and Practices home

Bueno y al punto, y al tema del post es el uso Enterprise Library for .NET Framework 2.0. En algunos casos he recibido consultas sobre como usar EntLib. Trataré de resumirlo en cuatro pasos, y mi parecer esto siempre existía incluso cuando usábamos el SqlHelper, o cuando lo hacíamos manualmente, y es que lo que ha cambiado son las herramientas, y el código pero no la forma:

  1. Importar los componentes de funcionalidad. En este caso para usar el Data Access Application Block, parte del EntLib, es referenciar o importar las DLL, o ensamblados, que se instalan con el EntLib. Son 3 las que se usan, bueno sólo hay que referenciar 2, la otra se agrega por depender de la otra. Las dos que debemos referenciar son: Microsoft.Practices.EnterpriseLibrary.Data.dll, y Microsoft.Practices.EnterpriseLibrary.Common.dll, automáticamente se debe agregar al bin el ensamblado Microsoft.Practices.ObjectBuilder.dll. De no pasar esto pues la copiamos manualmente a la carpeta de bin, o donde se ejecute nuestra aplicación.
  2. Escoger y conectarnos a una fuente de datos. Con el DAAB, tenemos una forma genérica para conectarnos a una base de datos, por ejemplo es transparente comunicarse a SQL o Oracle:

    DAB.Database dbTampico =
                DAB.DatabaseFactory.CreateDatabase(“cnTampico”);

    Hay que tener en cuenta, que al hacer esto, automáticamente esta iendose al archivo de configuración de la aplicación, y esta leyendo la cadena de conexión dentro de la sección de conecctionStrings. Indicar que en la conexión agregada en la sección de conecctionStrings se debe indicar el provider de la base de datos, es decir si es SQL o Oracle.

    Ahora la otra forma es hacerlo a un proveedor especifico como SQL o Oracle, hay clases especiales para ello:

    DAB.Sql.SqlDatabase dbTampico =
             new DAB.Sql.SqlDatabase(
                       “data source=.; integrated security = true; database=BD_Tampico”);

    Ya en cadenas de conexiones hay gustos y sabores.

  3. Recuperar, enviar información, es decir hacer transacciones con la fuente de datos. Y para el ejemplo sólo quiero traer todas las noticias:

    DataReader drPropuesta = dbTampico.ExecuteReader(
               CommandType.StoredProcedure, “usp_Noticias_TraerTodos”);

    Y eso es independiente si dbTampico es Database, SqlDataBase, u OracleDataBase, obviamente mientras más genérico menos se aprovecha funcionalidades particulares.

  4. Mostrar  la información. Y por último sólo queda mostrar la información recuperada:

    while (drPropuesta.Read())
    {
          Console.WriteLine(“Noticia: {0}”, 
                        drPropuesta[“Titulo”].ToString());
    }

  5. Estirar las piernas, ejecutar y mirar como funciona !

Obviamente que hay más cosas que ver en Data Access Application Block, y muchas más cosas que se pueden hacer, pero sólo es cuestión que lean, lean, lean y lean, pero también entiendan :),

Saludos,

Post cruzado

master page?, que estructura uso?

si bien un sitio puede estar funcionalmente bien, el otro impacto dependiendo del escenario, es el disenio del sitio. Muchas veces se convierte en un reto lograr un buen disenio para un desarrollador Web. A lo que el diseniador Web no le ve mayor problema.

Personalmente he visto dos formas de trabajar en cuanto a la estructura de un disenio, trabajar con tablas “<table>”, y trabajar con “<div>”. Llámese estructura a la base que permite dividir el menú, la cabecera y el contenido. También he trabajado con frames, pero poco, y con asp.net nunca lo he usado. Con asp.net he usado como estructura etiquetas table, y etiquetas div.

Ahora que pasa, ya tengo la estructura, pero como empiezo el disenio :S. De los amigos, diseniadores web, he podido ver que crean sus disenios revisando ejemplos de sites, y consolidando y agregando su estilo propio. Y que quiero decir con esto, que si no somos buenos en disenio, no es porque seamos malos en ello, sino porque no hemos revisado la suficiente cantidad de ejemplos de sites :). Aunque muchas veces es tedioso revisar el HTML, para comprobar que todo este correcto y no incumpla con los estándares, porque tampoco es sólo tomar un modelo, ver el código fuente y copiarlo. En otro post hablaremos un poco más sobre los estándares que propone la W3C como son html 4.0, y de xhtml 1.0, según dicen xhtml reemplazará al html, pero ese es otro post que por cierto tambíen hablaremos un poco de Expression Web y los estándares.

w3c

 

Pero por donde empiezo, si no tengo un diseniador web, no tengo modelos, y ni la menor idea de como empezar a diseniar por mi cuenta la estructura de mi sitio… pues tranquilos, para eso están los Starter Kits, y también tenemos plantillas de disenio.

Starter Kits for ASP.NET

Este recurso es excelente para diseniandores: ASP.NET for Designers.

P.D.: No por la excusa de que somos desarrolladores y no tengamos un diseniador web, vamos a crear un “sitio feo”, o que no cumpla con los estándares. Si no es un excelente disenio, por lo menos que sea agradable y amigable al usuario.

P.D.2: Si tienen preguntas avanzadas de disenio, pues preguntemos a los expertos: foro HTML.

Saludos,

Post cruzado

typeof vs if… y el limpiado (clear) de controles

leyendo el post de JuanFco, Limpiar informacion de los controles (TextBox’s) Rapidamente, y debido a que mi comentario se puso muy técnico, aproveche para hacer un post.


Cuanto tenía que hacer este tipo de cosas, limpiar masivamente usaba el mismo código pero con la comparación distinta, que me paso un amigo en un proyecto:


if ( c.GetType() == typeof(TextBox) ) {
    c.Text = “”;
}

Según la definición de “is” <http://msdn2.microsoft.com/es-es/library/scekt9xw(VS.80).aspx> realiza una conversión para comprobar si “c” es del tipo TextBox (según lo que interprete, salvo que el “y” sea conclusión y no conjunción :S). Parece que tiene más utilidad cuando vas a realizar conversiones y quieres comprobar si ese tipo es el que tu quieres.

Estuve probando los tiempos de diferencia y sólo en casos muy extremos hay ligera diferencia donde “is” toma unas milesimas de segundo más que “typeof“.

Y cómo todos ustedes se deben estar preguntando entonces, que uso typeof o is?, pués ya iba a terminar de enviar el comentario, y lanzar una idea de sentido común, y era que is podría reconocer herencia de clases. Y nada le puse manos a la obra, y mi sentido común tenia razón, is reconoce herencia:

Falso, de toda falsedad: ( textBox1.GetType() == typeof(Control) )

Comprobado, is reconoce herencia: ( textBox1 is Control )

Saludos,


Post cruzado

que bueno es estar nuevamente en un proyecto :)

hace aproximadamente 8 meses que no estoy en un proyecto real, deje los proyectos para regresar a mi ciudad y concluir la carrera :(, aunque he estado investigando personalmente, para dictar charlas, conferencias, o cursos, he incluso preparando material de entrenamiento para el trabajo, un proyecto es un proyecto

lo que se vive en un proyecto es único, y nadie te va quitar esa experiencia que has ganado. A parte que un proyecto te da base, ya que no sólo sabes un tema porque lo has investigado, sino porque lo has probado y lo has vivido en un ambiente real. Muchas veces la tecnología puede estar bien teóricamente, pero cuando lo llevas a un ambiente real, que no es igual a un ambiente de desarrollo donde todo está funcionando perfectamente, ahí verdaderamente se ve el valor de estar en un proyecto, popularmente, estas ahí cuando las papas queman :p

Aunque en la universidad te da la oportunidad de realizar proyectos académicos, no se dan todas las condiciones de un proyecto real, y muchas sirve como prueba de conceptos, y también pero porsupuesto, que un proyecto real es remunerado económicamente, los proyectos académicos tienen otro tipo de remuneración, pero a nadie creo que le desagrade recibir una remuneración económica al entregar un proyecto 😀

Otro tema es la elección del proyecto, particularmente pienso, claro y siempre cuando no tengamos ningún tipo de presión o responsabilidad, es escoger proyectos donde nos motiven a aprender algo nuevo. Y claro eso depende de tus objetivos personales, si sólo te interesa lo económico de un proyecto este no es el caso, pero si lo que verdaderamente quieres ir acumulando más, y más experiencia, escoger proyectos nuevos te dará esa satisfacción.

Para los estudiantes, especialmente a los que no tienen un horario flexible, una alternativa es el freelance. Aunque hay profesionales dedicados al freelance, para los estudiantes es una oportunidad de consolidar nuestros conocimiento en ambientes reales, y no tener que dejar de estudiar. Recién estoy incursionando en el mundo freelance, y vamos a ver que tal nos va, ya les cuento…

P.D.: Y pero porsupuesto, compartiré algunas cosas que vaya viendo en el proyecto, ya tengo un tema en mente, dentro de unos días lo verán en el blog…

Saludos,

Post cruzado

iniciandose con MS Expression Web – Starter Kits

en estas últimas semanas de presentación oficial de Windows Vista y Office System 2007 por Microsoft, y desde hace tiempo que existía en beta, se ha hablado mucho de Microsoft Expression…

en particular, para los desarrolladores/diseniadores Web, un nuevo producto ha sido lanzado Expression Web. No he usado las versiones  beta, pero en la presentación de EVO en Perú, he visto la versión final, según lo que pude ver esta herramienta promete mucho, y ahora que se ha presentado la oportunidad en un proyecto voy a empezar a usarla a ver que tal responde 🙂

… ya les cuento como me va… y si ya quieren empezar, pueden revisar estos Starter Kits.

Saludos,

Post cruzado desde starrillo blog