dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con...

60
entrevista Enrique Fernández-Laguilhoat Antonio Gómez David Salgado División de Desarrollo y Plataforma Microsoft Ibérica nº 47 abril 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System dedicada a los profesionales de la plataforma .NET dotNetManía www.dotnetmania.com dotNetManía Comunidad.NET Second Nug TodotNet@QA Asegurarse de que las técnicas son compatibles con la aplicación Silverlight 2.0 ¡Revolución! Sustituyendo el editor de celdas del control DataGridView • El Marco de trabajo de entidades de ADO.NET v3.5 (IV) • Componentes de uso general. De contadores y trazas • Visual Basic solidario. Viejas costumbres, nuevas formas Laboratorio.NET Crystal Reports 2008 Eventos Microsoft Tech-Days 2008. {The Evolution Show} y MIX 2008

Transcript of dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con...

Page 1: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

entrevistaEnrique Fernández-Laguilhoat

Antonio Gómez David Salgado

División de Desarrollo y PlataformaMicrosoft Ibérica

nº 47 abril 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System

www.

dotne

tman

ia.co

m

dedicada a los profesionales de la plataforma .NET

dotNetManíawww.

dotne

tman

ia.co

m

dotNetManía

Comunidad.NETSecond Nug

TodotNet@QAAsegurarse de que las técnicas soncompatibles con la aplicación

Silverlight 2.0¡Revolución!

Sustituyendo el editor de celdas del controlDataGridView • El Marco de trabajo de entidades

de ADO.NET v3.5 (IV) • Componentes de usogeneral. De contadores y trazas • Visual Basic

solidario. Viejas costumbres, nuevas formas

Laboratorio.NETCrystal Reports 2008

EventosMicrosoft Tech-Days 2008. {The Evolution Show} y MIX 2008

Page 2: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 3: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Bienvenido al número 47, de abril de2008, de dotNetManía.

Este mes entrevistamos, con MarinoPosadas de maestro de ceremonias, a tresde las cabezas visibles de Visual Studio2008 en Microsoft Ibérica: Enrique Fer-nández-Laguilhoat, director de la divi-sión de Desarrollo y Plataforma, AntonioGómez, jefe de producto de Visual Stu-dio y David Salgado, de la división deDesarrollo y Plataforma, que nos aportansu opinión sobre Visual Studio 2008 des-de el punto de vista del negocio, de losequipos de trabajo y de los desarrollado-res, respectivamente. La entrevista se rea-lizó durante la celebración del mayor even-to de presentación realizado por Micro-soft Ibérica hasta la fecha: Microsoft Tech-Days. {The Evolution Show}, que con másde 3.000 asistentes y un espectacular des-pliegue de medios, sirvió para presentarVisual Studio 2008, SQL Server 2008 yWindows Server 2008.

Le contamos los detalles sobre eseevento en este número, junto con unamagnífica crónica de Miguel Jiménezsobre el MIX ‘08, celebrado en LasVegas. Un evento cargado de noveda-des, como la presentación del nuevoInternet Explorer 8 (ahora en fase beta1), la beta de Blend 2 y toda la gama deExpression Studio 2.0 y la presentaciónde las primeras CTP de Blend 2.5. Ycómo no, la presentación de Silverlight2.0, del que hacemos una extensa intro-ducción en el artículo de portada de estemes. Braulio Díez y Reyes García seencargan de esta presentación con el

artículo “Silverlight 2.0: ¡Revolución!”.A partir de ahora seguiremos publican-do sobre el tema, pero ésta será la úni-ca introducción. Legiones de desarro-lladores de la plataforma .NET, aliadoscon diseñadores, se disponen a desarro-llar espectaculares aplicaciones Web conSilverlight 2.0. Con este número, ofre-cemos también un póster desplegable dereferencia para los desarrolladores deSilverlight, que se entregó en MIX ‘08.

Aprovecho para dar la bienvenida aSolid Quality Press, una nueva edito-rial especializada en tecnologías Micro-soft. Este mes recomendamos su primerlibro, que se edita en formato electró-nico y para el que han concedido un50% de descuento a los lectores de dot-NetManía. Gracias y suerte.

No quiero terminar sin destacar el ges-to de Guille, que desde su Isla VB quiereapoyar a Juanma y a su familia, aportan-do sus honorarios y un llamamiento públi-co a la ayuda para este niño de cuatro añosque padece el Síndrome de Alexander.Pienso que en cualquier actividad, espe-cialmente en las empresariales y profesio-nales, no podemos olvidarnos de quienessufren. A veces un pequeño gesto puedecambiar vidas, y sabiendo esto, es difícilno hacer nada. Ojalá y este gesto le sirvaa Juanma y anime a alguien a echar unamano y a otros autores a sumarse a las ini-ciativas solidarias que consideren, y quedesde dotNetManía hemos apoyado des-de siempre.

Por supuesto, dentro hay más. Espe-ro que le guste.

dotN

etM

anía

<<

3

Silverlight 2.0

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 47 • Abril 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, LuisMiguel Blanco y Miguel Katrib (Grupo Weboo)

Empresas Colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroDaniel Seara, Miguel Jiménez y Unai Zorrilla.

IlustracionesMascota (Clico): Yamil HernándezPortada: Javier Roldán

FotografíaRoberto Mariscal

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Thomas Edison, 4 Oficina 1406Parque empresarial Rivas Futura

28521 - Rivas Vaciamadrid (Madrid)www.dotnetmania.com

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

Page 4: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

sumario 47Eventos 06-09

Microsoft Tech-Days 2008. {The Evolution Show}.MIX 2008.

Entrevista a Enrique Fernández-Laguilhoat, Antonio Gómez y David Salgado 10-13Nos encontramos en una sala de prensa del Palacio de Congresos y Exposiciones de Madrid, paracharlar con tres de las cabezas visibles de Visual Studio 2008 en Microsoft Ibérica, y que a su vezrepresentan los tres enfoques de interés que pueden tener los lectores de dotNetManía en esteproducto: Enrique Fernández-Laguilhoat, director de la división de Desarrollo y Plataforma, quenos hablará del producto desde un punto de vista estratégico; Antonio Gómez, Jefe de producto deVisual Studio, que nos hablará sobre el impacto del nuevo producto de cara a los responsables deproyectos; y David Salgado, de la división de Desarrollo y Plataforma, quien nos dará la visiónmás técnica de las nuevas capacidades que presenta esta nueva versión del entorno integrado. P

Sustituyendo el editor de celdas del control DataGridView 14-20La edición de valores alfanuméricos en las celdas de un DataGridView para Windows Forms esuna operación que podemos llevar a cabo gracias a que este control, cada vez que vamos a modificaruna celda, aloja en la misma un cuadro de texto para editar su valor. Sin embargo, con ciertos tiposde datos, lo deseable sería disponer de un control específico para su edición. La arquitectura delDataGridView, aunque no ofrece de modo directo esta característica, permite al programadordesarrollarla, por lo que a lo largo del presente artículo desvelaremos los puntos clave a tratar paralograr este objetivo.

El Marco de trabajo de entidades de ADO.NET v3.5 (IV) 22-26En nuestras entregas anteriores hemos venido presentando los diferentes mecanismos que ofrece elMarco de entidades de ADO.NET 3.5 para permitir la creación y subsiguiente explotación demodelos conceptuales mapeados sobre modelos relacionales de bases de datos. En esta entregacontinuaremos explorando esos mecanismos.

Silverlight 2.0: ¡Revolución! 27-34Silverlight 2.0 es la palabra de moda. Seguro que, aun estando en beta, ha escuchado algo acerca deesta tecnología en los últimos meses… En este artículo veremos qué hace de la versión 2.0 unproducto tan esperado, cómo se desarrolla con él y cómo integrarlo en nuestras aplicaciones Web.

Componentes de uso general. De contadores y trazas 36-40Siguiendo con la serie de componentes de múltiples usos, veamos cómo crear nuestros propioscontadores y definir trazas, lo cual nos permitirá identificar aquellas situaciones que puedanprovocar dolores de cabeza cuando toda la aplicación esté en uso.

Visual Basic solidario. Viejas costumbres, nuevas formas. 42-46No, no es que a Microsoft le haya dado por crear una nueva versión de Visual Basic que se solidaricecon la humanidad. Pero el que escribe quiere que los lectores de esta “Isla VB” sí se solidaricen, y esasolidaridad solo la pueden demostrar actuando. ¡Espero que actúen!

dnm.todotnet.qaAsegurarse de que las técnicas son compatibles con la aplicación 48-50

dnm.laboratorio.net 51-54Crystal Reports 2008

dnm.biblioteca.net 55Novedades de Visual Basic 9.0C# 3.0 Cookbook

dnm.comunidad.net 56-57Second Nug. Grupo de usuarios de .NET Online

dnm.desvan 58

Page 5: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 6: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Se habló de más de 3000 personas inscritas en el queha sido el evento con mayor éxito organizado porMicrosoft España en toda su historia, durante los pasa-dos días 26 y 27 de febrero y con el lema “Nuestrosprotagonistas {Aquí. Y ahora}”. Los 30.000 m2 delPalacio de Congresos y Exposiciones de Madrid sir-vieron de marco para una presentación de lujo de tresproductos de lujo: Visual Studio 2008, SQL Server

2008 y Windows Server 2008. Microsoft cumplíaademás sus 20 años de implantación en España (el día27, precisamente) y los asistentes pudimos asistir avarios tracks de presentaciones en paralelo sobre tec-nologías de todo tipo que cubrieron tanto aspectosgenerales de las herramientas y sistemas que se pre-sentaban, como otros bien específicos, impartidos porespecialistas de Microsoft y otros conocidos evange-

listas tecnológicos. Además, se impartie-ron laboratorios de trabajo (Hands-on-Labs u HOL), donde los participantespueden probar, de forma tutelada, lasnuevas características de los productospresentados, y hubo sorteos, concursosde programación y zonas de recreo digi-tal, que concluyeron con el concursoprincipal –en el Auditorio y presentadopor Inma del Moral–, donde se regalóuna motocicleta Harley-Davidson al afor-tunado ganador justo antes de dar pasouna charla de Rosa Mª García, presi-denta de Microsoft Ibérica, quien evaluó

Microsoft Tech-Days 2008 {The Evolution Show}

eventos

<<

event

os

Page 7: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

7

dnm.directo.eventos<<

–junto a los partners de platino– la situación de la tecno-logía en nuestros días y el impacto que se espera que estasnovedades tengan en el próximo futuro. El evento con-cluyó con una conexión a Los Ángeles (CA-EE.UU.),para presenciar por videoconferencia la sesión en direc-to de un Steve Ballmer más comedido que nunca, cons-ciente de que la audiencia no solo era norteamericana.

En la zona de sponsors, se dieron cita empresas bienconocidas a nivel nacional e internacional, con más de50 representaciones en los stands y zonas de “Pregun-te a los expertos (Ask-The-Experts)”, presentacionesde productos, y una fiesta final, con grupo musical inclui-do, que sirvió para relajar tensiones.

El interés del público en las sesiones fue más quenotable, y era raro que –tras cada charla– no hubieraun rosario de preguntas añadidas para investigar másen las tecnologías, y especialmente, para pulsar lasposibilidades de implantación que éstas tenían en cadacaso particular. Se vieron demos espectaculares y tam-bién se habló de lo que se espera a lo largo del año encurso: Hyper-V, Silverlight 2.0, la solidez y nuevasofertas de SQL Server 2008, y todo un rosario de tec-nologías. Si el lector quiere, puede –a toro pasado–ver una gran oferta activa en el sitio Web creado parael evento: http://www.microsoft.com/spain/lanzamien-to2008/default.mspx.

Microsoft Tech-Days 2008 en LisboaEn esta ocasión, casi 2000 personas se dieron cita en este evento de nuestro país veci-no. Estructurado de forma similar al año pasado, aglutinaba, por así decirlo, dos even-tos en uno: los Tech-Days y el Lanzamiento 2008, por lo que la temática y contenidode las ponencias era similar al que tuvimos ocasión de ver en Madrid a finales de febre-ro. Al igual que el año pasado, se alojaron en el Centro de Congresos de Lisboa has-ta 9 tracks simultáneos, siguiendo un formato similar al utilizado en los Tech-Ed entodo el mundo, con la única diferencia de que aquí no se establece una separaciónentre los eventos de desarrollo y los de IT Pros.

La mayoría de los profesionales portugueses tuvieron ocasión de impartir charlas espe-cializadas, y encontramos muchas caras conocidas, como Paulo Morgado, Luis Silva,Eurico Soalheiro, Tiago Pascoal, Jose Antonio Silva o Miguel Caldas, quien abrió elevento con su keynote. Pero también había que destacar presencia extranjera: Stephen For-te, Bart De Smet, Beat Schwegler, Raymond Chen, Robertjan Tuit, Jan Blomquist,Rob Miles, Matt Gibbs y nuestro redactor jefe, Marino Posadas (Solid Quality Men-tors), único representante español, quien en esta ocasión habló sobre las “Características arquitectónicas y prácticas del SDK de construc-ción de lectores de noticias”, ahora denominado Syndicate Client Experience (SCE) Starter Kit.

Además de las charlas, se impartieron varios laboratorios (Hands-on-Labs) y pudimos contar con áreas de colaboración y espar-cimiento, donde –como siempre– la XBOX se llevó la palma. Desde el punto de vista comercial, la zona de expositores estuvo másanimada, si cabe, que el año pasado, con una completa representación portuguesa e internacional. Finalmente, queremos expresarnuestro agradecimiento a Nuno Costa y Sergio Martinho de Microsoft, por todas las atenciones para con nosotros.

Vista parcial de la sala durante la conferencia sobreSyndicate Client Experiences con Marino Posadas.

Texto: Marino PosadasFotografía: Roberto Mariscal

Page 8: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Es casi media noche y desde el norte de Nevada ya sevislumbra el resplandor de la ciudad del pecado. Enescasas millas llegaremos, un año más, a Las Vegaspara asistir a la edición de este año de 2008, dondeMicrosoft planea sorprendernos con los últimos bitsy técnicas en el mundo de la Web, la experiencia deusuario y el diseño. Esto es lo primero que pensé mien-tras conducía camino al The Venetian, el hotel don-de se celebra anualmente el MIX, tras un mini road-

trip por tierras americanas donde recorrimos parte deCalifornia, Nevada y Arizona. Es lunes 3 de marzo de2008 y el show está a punto de comenzar.

Al llegar al hotel nos reencontramos con el des-tacamento de Microsoft Ibérica, formado por Enri-que Fernández-Laguilhoat y Carlos Oramas, quenos acoge en la ciudad, proporcionando la ayudanecesaria a todos los newbies que llegan desde la tie-rra de Cervantes. A las ocho de la mañana del mar-tes comienzan las sesiones y las presentaciones, enesta ocasión un evento paralelo denominado Toget-her @ MIX’08, que aúna representantes de variospaíses. Para una audiencia claramente europea, HansVerbeck y Carrie Longson, representantes de DPETimeZone (antiguo Microsoft DPE EMEA), intro-ducen los paneles que se sucederán durante la maña-na y las actividades de la tarde. Durante aproxima-damente cinco horas contamos con diferentes sesio-nes de pre-conferencia, donde vimos las novedadesen Surface, Blend, Silverlight y WPF de la mano deimportantes representantes de Microsoft.

Durante la tarde se organizaron diferentes activi-dades para conseguir que los asistentes al Together,alrededor de doscientas personas, se relacionasen, dis-cutiesen y se crease ese ambiente especial de “mezcla”que es el MIX en sí mismo. Entre las actividades selec-

MIX 2008

eventos

<<

event

os

Page 9: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

9

dnm.directo.eventos<<

cionadas se realizaron excursiones alas montañas rusas de la Stratosphe-re Tower, un paseo a caballo por eldesierto del oeste americano en elRed Rock Canyon, una introducciónal gambling en un casino de Las Vegasy una guía de compras por las mejo-res tiendas de diseño de la ciudad. Sinduda, una oportunidad única deconocer al resto de asistentes.

Comienza la mañana del miér-coles 5 de marzo y el jetlag nos impi-de dormir más tarde de las siete. Nospreparamos para desayunar en elrecién inaugurado MIX’08 y buscarun buen sitio para la keynote de aper-tura. Un discurso de Ray Ozzie nospresenta la visión de la compañía ylas cinco divisiones en las que se cen-tran todos los esfuerzos; sin duda unabuena introducción de negocio paralos asistentes menos techies, que enbreve quedarán eclipsados por laspalabras de Scott Guthrie.

Para empezar, se presenta enpúblico por primera vez InternetExplorer 8 y se pone a disposiciónde los asistentes la beta 1 en el cen-tro de descargas; las principalesmejoras incluyen WebSlices, Activi-ties y un nuevo modelo de renderi-zación basado en los estándarespublicados por el W3C junto asoporte completo de CSS 2.1 com-pletamente reescrito. El nuevomodelo de renderización hacemuchas páginas que se visualizabancorrectamente en IE7 incompatibles

con IE8, entre ellas Google Maps (yno porque renderice incorrecta-mente, sino porque muchos de losdesarrolladores Web incluían en sushojas de estilo hacks para InternetExplorer que ya no son necesarios ylo que conseguirían en este caso esromper el layout), y por ese motivose ha incluido la opción de renderi-zación “Compatible con IE7” de for-

ma que se pueda minimizar el impac-to visual hasta que se corrijan lashojas de estilo en los sitios afectados.Las otras dos novedades importan-tes en IE, WebSlices y Activities, pre-sentan un nuevo paradigma de inte-racción online y offline en la Web jun-to a un pequeño SDK para poderdesarrollar nuevos elementos demanera rápida con una especie demanifiestos en XML. Por otro lado,se han integrado diferentes herra-mientas para desarrolladores (exis-tentes como complementos actual-mente) y un depurador de JavaScriptbastante interesante.

Con respecto a Silverlight, sepresentó la nueva versión 2.0 y elnuevo conjunto de herramientascompatibles: plug-ins para navega-dores, extensiones para Visual Stu-dio, proyectos para Blend. Entrelas novedades incluidas en Silver-light 2.0 destaca por encima detodas la eliminación de JavaScripty la integración a través del Dyna-mic Language Runtime (DLR) deC#, VB.NET, JScript, IronRuby o

IronPython como lenguajes deprogramación. Esto presenta unmodelo de desarrollo completa-mente nuevo, pues el DLR (que noes más que una extensión dinámi-ca de un subconjunto del CLR de.NET) es capaz de ejecutarse enmúltiples plataformas y navegado-res, incluidos OSX, Vista y Linuxgracias a Moonlight.

Durante la keynote se presenta-ron numerosas aplicaciones desa-rrolladas con la última versión tan-to de Silverlight como de WPF,entre otras las de NetFlix y Cirquedu Soleil. Pero sin duda, otro delos platos fuertes presentadosdurante el MIX’08 fue la entradaen beta de Blend 2 y toda la gamade Expression Studio 2.0; la pre-sentación de las primeras CTP deBlend 2.5 y la introducción, por-que fue extremadamente breve, delas novedades en cuanto a rendi-miento y funcionalidad que seincluirán en la revisión 3.9 del.NET Framework.

Sin duda, un evento cargado denovedades interesantes desglosadasen los 3 días de sesiones y activida-des incluidas. Nos vemos el próxi-mo 2009 en Las Vegas. Happycoding 2.0.

Texto: Miguel JiménezFotografía: José Carlos Palencia

Page 10: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Marino Posadas

Marino Posadases director de tec-nologías de desa-

rrollo para Españay Portugal de Solid

Quality Mentors.Puedes leer su blog

en http://www.elavefenix.net.

entrevista

Director de la división de Desarrollo y Plataforma

Jefe de producto de Visual Studio

entrevista a Enrique Fernández-Laguilhoat,

Antonio GómezDivisión de Desarrollo y Plataforma

David Salgado

Nos encontramos en una sala de prensa del Palacio de Congresos y Exposiciones de Madrid,para charlar con tres de las cabezas visibles de Visual Studio 2008 en Microsoft Ibérica, yque a su vez representan los tres enfoques de interés que pueden tener los lectores dedotNetManía en este producto: Enrique Fernández-Laguilhoat, director de la división deDesarrollo y Plataforma, que nos hablará del producto desde un punto de vista estratégi-co; Antonio Gómez, Jefe de producto de Visual Studio, que nos hablará sobre el impacto delnuevo producto de cara a los responsables de proyectos; y David Salgado, de la división deDesarrollo y Plataforma, quien nos dará la visión más técnica de las nuevas capacidades quepresenta esta nueva versión del entorno integrado. Por razones operativas, comenzamoscharlando con Antonio Gómez.

y

Page 11: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Quería que nos comentaras cuál es elimpacto que puede tener la salida deVS2008 haciendo, si quieres, una com-parativa con lo que pasó con VS2005y qué es lo que aporta la nueva versión(pues hay gente que opina que es unremake), fundamentalmente desde elpunto de vista de las personas quetoman decisiones a la hora de abordarlos desarrollos y que deciden cuál esla tecnología a usar.

Con Visual Studio 2005 ofrecimosuna primera versión de lo que era un pro-ducto destinado a cubrir todo el ciclo devida del desarrollo de software, empe-zando a identificar los distintos roles; erala primera versión de un ALM, y nuestraprimera solución integral para empresaso equipos de desarrollo. Anteriormente,

los equipos de desarrollo utilizaban VisualStudio .NET 2003 con las versiones másaltas que tenían, pero a la hora de traba-jar en equipo no había distinción entrelos diferentes roles: todos eran desarro-lladores. Tal y como han evolucionado lastecnologías de desarrollo de software, losfabricantes hemos estandarizado los rolesdel mundo del desarrollo. Tenemos ana-listas, arquitectos, jefes de proyectos, tes-ters y profesionales de bases de datos

(muchos no identifican ese rol, pero noso-tros sí hemos visto que es importante).Visual Studio 2005 fue la primera ver-sión, y entre esa versión y esta segundamedian tres años de desarrollo intenso,que se reflejan en múltiples aspectos, des-de la mejora de la cobertura a los distin-tos roles hasta las nuevas característicasincorporadas a Team Foundation Server,que nos permiten ofrecer una soluciónbastante más modular que con Visual Stu-dio 2005. Pero en general Visual Studio2008 no puede considerarse una majorrelease en lo que a desarrollo en equiposse refiere. Eso está previsto para el añoque viene (2009), en el que veremos lapróxima versión de Visual Studio TeamSystem, conocida por el momento por elnombre en código Rosario.

Con relación a esa cobertura paratodos los roles de la que hablas,¿sigue estando Visual Studio 2008,en tu opinión, más enfocado al roldel developer/tester, o podríamosdecir que ya cubre en un porcenta-je igual a todos los personajes queintervienen en el ciclo de vida?

Con cada nueva versión de Visual Stu-dio vamos tendiendo hacia una soluciónque cubre más completamente cada uno

de los roles. Por supuesto, el rol de desa-rrollador es en el que venimos trabajan-do desde hace 10 años, y la cobertura paralo que hoy conocemos como team develo-per es excelente. Últimamente han mejo-rado muchísimo las posibilidades que elproducto ofrece para el rol del profesio-nal de bases de datos. Otras áreas, comola de testing o la de arquitectura, continúanmadurando, y son áreas que seguramen-te se verán reforzadas en Rosario.La percepción que se tiene cuandose habla de Team System es que sehabla como de dos propuestas: unaque es la de Team System paraCMMI y la otra, más centrada en lastecnologías ágiles. ¿Es eso una elec-ción para el usuario o hay algo másdetrás de esa oferta, a la hora de deci-dir el ciclo de vida a abordar?

Nosotros nos estamos basando en losestándares definidos por el mercado; esdecir, un estándar como CMMI pasa deser una metodología o una serie de prác-ticas a convertirse en un estándar, en nues-tro ISO del desarrollo. Sobre todo lasgrandes organizaciones, que acometengrandes proyectos, lo requieren. Micro-soft no podía dejar de soportar las prác-ticas y mejoras que necesitaba ese mode-lo. Actualmente cubrimos CMMI hastael nivel 3 de la especificación oficial. Porotra parte, también apoyamos las meto-dologías ágiles, como SCRUM, y lo quenosotros indicamos a nuestros clientes esque es cada uno quien tiene que elegirqué metodología quiere utilizar, depen-diendo de las características del proyec-to o de las personas de que disponga. Estoabre todo un abanico de posibilidades. ¿Sería una cuestión de envergadurade proyecto?

Yo creo que es un requisito del clien-te final, que “pesa” más que el proyectoen sí. Otro elemento a tener en cuenta esque muchas empresas van a empezar aexigir estos estándares, y todas las softwa-re factories que tenemos en España (se creaprácticamente una cada mes) quierensubirse al carro de CMMI 5 o tener esenivel en cada uno de sus equipos y en cadauno de sus proyectos, porque hay softwa-re factories que pueden tener miles de per-

dotN

etM

anía

<<

11

dnm.directo.entrevista<<

De izquierda a derecha: Marino Posadas, Enrique Fernández-Laguilhoat y David Salgado

Page 12: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

12

dnm.directo.entrevista<<

sonas en sus equipos de desarrollo. Lacomplejidad de los proyectos por supues-to influye en la elección del cliente, perolo que no podemos es estar nunca fuerade esa elección…El siguiente tema relacionado con estoes que, aunque el producto presentauna oferta ALM, para la adopción deesa oferta tengo que ver –si soy res-ponsable de un equipo de desarrollo–hasta qué punto a mis empleados lesva a resultar fácil de adoptar. MSDNsiempre ha sido muy cuidadoso enque las ayudas de Visual Studio seanbastantes amplias, pero quizás paraun aprendizaje de metodologías nobaste una ayuda online…

No todo va en MSDN online; tene-mos lo relacionado con MSF, que son unaserie de plantillas que facilitan todo el pro-ceso de desarrollo y que tú puedes utili-zar como guías cuando desarrollas un pro-yecto… A casi todo el que pasa un cursoserio de introducción a CMMI, cuandosale del curso después de tres o cuatro días,no le duele la cabeza: le duele el cerebro.Es decir, es algo que puede ser bastanteduro a la hora de implantarlo. Por un lado,tienes la metodología y las herramientas,y por otro lado a las personas, y si éstas nosiguen la metodología ni comprenden lasherramientas, ahí es donde se presentanlos problemas. Está claro que tenemos quetener gente preparada a nivel teórico, conunas herramientas que te permitan hacer-lo (y nosotros las tenemos), y unas plan-tillas, en la parte de MSF, que te hagan

seguir patrones y no perderte en el deve-nir de una metodología compleja comopuede ser CMMI. En ciertos casos, unametodología ágil puede llegar a hacersecompleja, dependiendo de qué roles inter-vengan y cuánta gente metamos...Bien, pues damos paso a EnriqueFernández-Laguilhoat…En la introducción decíamos que tene-mos tres tipos de lectores: el jefe deproyecto, que será el que atienda almensaje que nos ha transmitido Anto-nio; el que toma decisiones, que estarámás interesado en el mensaje que nosdes tú; y el que programa, que será elque se interese más por lo que noscomente David después. Así que siquieres pasar a introducir el tema…

Desde el punto de vista del que tomadecisiones, que es el que patrocina eldesarrollo, el que lo está pagando, yocreo que incorporamos nuevas funcio-nalidades que son muy interesantes y quepermiten que los equipos de desarrollono estén desvinculados de la gente denegocio. El esfuerzo que se ha hecho enVisual Studio 2008 en la parte de repor-ting, por ejemplo, es extremadamentecrítico, y las conexiones que estamosabriendo con productos como Project oProject Server permiten empezar a gene-rar una serie de informes que entiendenmucho mejor personas de negocio, queno son técnicos; son informes más deevolución de proyectos, de costes ydemás. Y éste es un gran avance…Ahí vamos al meollo de la cuestión.Tú has dicho costes, entonces la pre-gunta sería: ¿cuál va a ser el ROI parala gente que empeña su palabradiciendo “vamos a usar esta tecno-logía” esperando que después seproduzca el retorno de la inversión?

Pues mira, me decía un cliente queésta es una funcionalidad que no estamosvendiendo y que no le estamos dando lavisibilidad que merece; es justamente laconexión con el concepto de Project.Cualquier empresa presente en este even-to tiene gente que es capaz de manejarProject como una herramienta no solo degestión de recursos, tiempos y demás, sinotambién como una herramienta de ges-

tión económica. El hecho de que poda-mos trasladar el proceso de desarrollo desoftware a este entorno es una novedadde enorme importancia, que puede inci-dir en muchos aspectos como el controlde costes, la gestión de los retrasos y susimplicaciones o la redistribución de losrecursos.…como recomienda MSF.

Efectivamente. La novedad es estaintegración que antes no existía, no eranada evidente. Por primera vez ahoraestamos en condiciones de dar unaherramienta que entiende más gente denegocio, que habla más en términos derecursos, de dinero, etc.¿Cuál es el nivel de implantaciónesperado? Supongo que tendréiscifras de esto…

Mira, a nivel de ALM las cifras nosha sorprendido gratamente. Sabes queempezamos a incorporar estos recursosen Visual Studio 2005, y en este momen-to, más de la mitad de nuestras ventas hanpasado al concepto de desarrollo en equi-po. Yo no me esperaba un despegue tanfuerte; pensé que seguiríamos vendiendomucho la versión Professional, o sea, elentorno de desarrollo único, pero no unamigración tan rápida. De hecho, las cifrasapuntan en la dirección de que, sobre todoen la gran cuenta o grandes empresas dedesarrollo, se está adoptando el conjun-to de herramientas Visual Studio TeamSystem y Team Foundation Server de unaforma extremadamente rápida. Eso quie-re decir que lo estamos haciendo bien,que el producto es muy bueno, y la ver-

Enrique Fernández-Laguilhoat

Antonio Gómez

Page 13: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

dad es que muchos clientes nos lo estándiciendo. Esta mañana, en mi charla,decía: “si usted tiene la suerte de ser undesarrollador único y usted es el tester,pues es una bendición”. Pero, la realidades que hay mucha gente involucrada enlos proyectos y esa es nuestra realidad…Antes de pasar al desarrollo puro conDavid, ¿quieres decirnos alguna cosamás?

El mensaje es que yo –como personade negocio –, por fin controlo. Y no solocontrolo, sino que también puedo estaratento a ciertas alertas cuando un pro-yecto se está desviando, y que además setermine con esa situación “antagónica”que había antes entre el que pagaba laaplicación, la persona de negocio, y elequipo de desarrollo. Ahora somos unequipo y, como tal, tomamos decisionesjuntos. Yo creo que ése es el gran cambioy en esa dirección vamos.

Permíteme por último que me vayaal otro extremo, al diseñador, el que lepone la “cara bonita” a las aplicaciones,un rol muy independiente y que en elmundo Microsoft también les involu-cramos, porque son fundamentales. Lainterfaz de usuario es cada vez másimportante para los clientes, y la inte-racción adecuada entre diseñadores ydesarrolladores cada vez más necesaria.Ahora por primera vez, con una serie detecnologías perfectamente compatibles,Visual Studio del lado del desarrollo yExpression del lado de diseño, se extien-de ese concepto de equipo.

Al final, el objetivo de Microsoft es quese produzca software de más calidad enmenos tiempo: ése es nuestro objetivo.David, como programador, ¿qué des-tacarías tú?

Destacaría lo mismo que han comen-tado tanto Enrique como Antonio, y esque apoyamos por todas las vías posiblesla creación de software de calidad, noimporta si se trata de un gran proyecto ode uno pequeño creado por un desarro-llador individual. Al final, la herramien-ta te ayuda en diferentes niveles: en el casodel desarrollador individual, tambiénvamos a tener la posibilidad de crear uncódigo de más calidad de una manera más

productiva: mi código se podrá benefi-ciar del testeo unitario, de la capacidadde depuración mejorada, de la disponibi-lidad de ayuda Intellisense para los tiposdinámicos que se van generando… Esotra manera más operativa de generarcódigo de calidad. Entonces yo creo queestamos alineados, en diferentes niveles.Aparte de estas mejoras que hasmencionado ¿podrías decirnos más,hasta tener un top 10 de las mejorasque aporta Visual Studio 2008?

La cantidad de mejoras incorporadasen esta versión es enorme. Puedo men-cionarte rápidamente algunas, como lasmejoras en el rendimiento (tanto del pro-pio entorno como del código generado),la integración de WPF y WF para expo-ner servicios, las novedades en los len-guajes de programación o la integraciónde la capa de gestión de datos dentro delos lenguajes, donde podemos mencio-nar tecnologías tan importantes comoLINQ o ADO.NET Entity Framework,una de las grandes promesas de la plata-forma de datos de Microsoft.

Realmente tendríamos que ir vien-do las mejoras para cada uno de los tiposde proyectos que podemos acometer…Bueno, y el hecho de que existennuevos tipos de proyectos, como porejemplo Silverlight, ASP.NET 3.5con AJAX integrado…

Efectivamente, en el mundo del desa-rrollo Web tenemos por un lado AJAXintegrado dentro de Visual Studio, y por

otro lado unos pequeños adelantos de loque irá sacando en el futuro inmediato elgrupo de producto, como las ASP.NET3.5 Extensions Preview. Podemos utili-zar WCF en entornos de confianza par-cial, XBAP sobre Firefox… Hay unmontón de novedades importantes.Con respecto a las nuevas capacida-des de depuración, poder depurarhebras individuales es algo funda-mental en múltiples situaciones,como cuando quieres hacer anima-ciones en WPF.

Para poner eso en contexto, ayer loque estábamos viendo durante mi charlaera una aplicación que utilizaba varioshilos de ejecución. Con esta nueva ver-sión podemos movernos por los diferen-tes hilos de ejecución, ponerle un nom-bre a cada uno para poder identificarlos,o ver la ejecución diferencial de cada unode los hilos por colores. A la hora de depu-rar aplicaciones de múltiples hilos estasposibilidades son vitales.¿Qué puedes decirnos respecto a loslenguajes? De LINQ ya hemoshablado mucho…

LINQ ha sido, hasta cierto punto, laexcusa perfecta para incorporar mejorasen los lenguajes. Personalmente, soy unenamorado de var, de la inferencia detipos a la hora de declarar una variable(además conocí al chico que lo programóy me dijo “úsalo, que es maravilloso”). Meencantan las expresiones lambda y las pro-piedades automáticas, que permiten redu-cir la cantidad de líneas de código; todoslos métodos extensores de los que ahoradisponemos para el manejo de coleccio-nes; me parece genial que por fin los pro-gramadores de Visual Basic tengan herra-mientas para refactorizar el código...

Parece que tenemos una tendencia air hacia lenguajes con características fun-cionales. Creo que vamos a seguir ten-diendo hacia eso; no sé si va a haber máscambios en C# en ese sentido, o si sepotenciarán lenguajes como F#, pero aho-ra que también estamos entrando entemas de paralelismo, concurrencia, sis-temas distribuidos, creo que veremos máscaracterísticas de lenguajes funcionalesdentro del plataforma.

David Salgado

Page 14: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

El uso de controles alternativos paraeditar celdas

Si el valor del campo que necesitamos modificarestá basado en texto simple, la funcionalidad están-dar de este control es suficiente, pero ¿qué ocu-rre si nos enfrentamos a números o fechas? Paraestos casos, otros controles como NumericUpDown,MonthCalendar, etc. seguramente serán más ade-cuados para estas labores de edición, si los inclui-mos en las celdas del DataGridView.

Para conseguir esta funcionalidad, deberemosintroducirnos en la maquinaria interna del control yrealizar unos “pequeños ajustes”, con los cuales logra-remos editar las celdas utilizando el control de nues-tra elección. El ejemplo sobre el que centraremosaquí nuestra atención consistirá en la creación de unacolumna cuyas celdas albergarán valores numéricos,los cuales editaremos a través de un control NumericUpDown ubicado en cada celda que editemos.

Punto de partida: establecer la estructura de clasesEn primer lugar, crearemos un proyecto Windowsal que agregaremos un archivo de clase, en el cual

vamos a escribir las declaraciones de las clases quevan a constituir el esqueleto básico de esta arqui-tectura. El lector puede encontrar el código com-pleto del ejemplo desarrollado para este artículoen la dirección http://www.dotnetmania.com.

Dado que el objeto más inmediato que mani-pularemos será la columna del control de cuadrí-cula, crearemos una clase derivada de Data-GridViewColumn. A continuación, procederemosigualmente con la celda, creando una clase queherede de DataGridViewTextBoxCell. Finalmen-te, crearemos una tercera clase, que constituiráel núcleo del proceso de edición, para lo cualdeberá heredar del control que vayamos a uti-lizar para editar la celda (en nuestro caso, Nume-ricUpDown), e implementar la interfaz IData-GridViewEditingControl, cuyos miembros pro-porcionarán la funcionalidad necesaria queactuará de puente entre el control de edición yla celda que lo contiene. En el listado 1 seencuentran estas declaraciones.

La clase NumArribaAbajoColumnEsta clase, derivada de DataGridViewColumn, será laencargada de recabar toda la información necesa-

Sustituyendo el editor de celdas del controlDataGridView

plataforma.net

La edición de valores alfanuméricos en las celdas de un DataGridViewpara Windows Forms es una operación que podemos llevar a cabo gra-cias a que este control, cada vez que vamos a modificar una celda, alojaen la misma un cuadro de texto para editar su valor. Sin embargo, conciertos tipos de datos, lo deseable sería disponer de un control especí-fico para su edición. La arquitectura del DataGridView, aunque no ofre-ce de modo directo esta característica, permite al programador desa-rrollarla, por lo que a lo largo del presente artículo desvelaremos lospuntos clave a tratar para lograr este objetivo.

Luis Miguel Blanco esredactor de ddotNet-

Manía. Es consultor enAlhambra-Eidos.Ha

escrito varios libros ydecenas de artículossobre la plataforma

.NET. Consulta su blog:http://geeks.ms/blogs/

lmblanco

Luis Miguel Blanco

Page 15: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

15

dnm.plataforma.net<<

ria para configurar el control que alo-jaremos en la celda.

Puesto que la columna es el mediode que dispone el programador paraconfigurar el control contenido en lacelda, crearemos en esta clase un con-junto de propiedades que se corres-pondan con las propiedades del controlde edición. Dada la extensión del códi-go de las clases utilizadas, en las pági-nas del presente artículo se ofrecenaquellas partes más importantes de lasmencionadas clases, encontrándose dis-ponibles en su totalidad en el enlacecorrespondiente al material de apoyodel artículo. En el listado 2, el lectorpuede ver una parte del código corres-pondiente a la columna.

Fijémonos en el constructor de estaclase. Una columna necesita conocer eltipo que tendrá que usar a la hora deconstruir sus celdas; por lo tanto, invo-camos aquí al constructor base, que reci-be como parámetro una instancia deDataGridViewCell –más concretamente,de nuestra clase NumArribaAbajoCell–,derivada de DataGridViewTextBoxCell,que utilizará como plantilla en la crea-ción del celdas.

Por otra parte, para permitir la orde-nación de la columna, asignamos a su

propiedad SortMode el valor Automatic dela enumeración DataGridViewColumn-SortMode, lo que provocará que dichaordenación se produzca automática-mente al pulsar sobre su cabecera.

La clase NumArribaAbajoCell Tras la columna, el paso lógico será lacreación de la clase que represente alas celdas, heredando de DataGrid-

ViewTextBoxCell. El funcionamiento adesempeñar por esta clase va a consis-tir en devolver información acerca delos tipos utilizados para editar la cel-da y su valor, para lo cual reemplaza-remos respectivamente las propieda-des EditType y ValueType de la clasebase.

Utilizaremos la propiedad Default-NewRowValue para devolver el valor de lacelda cuando sea creada una nueva filaen la cuadrícula.

using System.Windows.Forms;

using System.Drawing;

//....

class NumArribaAbajoColumn :

DataGridViewColumn

{

//....

}

class NumArribaAbajoCell :

DataGridViewTextBoxCell

{

//....

}

class NumArribaAbajoEditingControl :

NumericUpDown,

IDataGridViewEditingControl

{

//....

}

class NumArribaAbajoColumn : DataGridViewColumn

{

// campos

private decimal nMaximo;

private decimal nIncremento;

private bool bSeparadorMiles;

private int nPosicionesDecimales;

//....

// en el constructor establecemos el tipo de celda

// que utilizará esta columna

public NumArribaAbajoColumn()

: base(new NumArribaAbajoCell())

{

// modo de ordenación de los datos

this.SortMode = DataGridViewColumnSortMode.Automatic;

}

//....

// propiedades para configurar la celda cuando

// editemos su valor mediante el control NumericUpDown

public decimal Maximo

{

get { return nMaximo; }

set { nMaximo = value; }

}

public decimal Incremento

{

get { return nIncremento; }

set { nIncremento = value; }

}

public bool SeparadorMiles

{

get { return bSeparadorMiles; }

set { bSeparadorMiles = value; }

}

public int PosicionesDecimales

{

get { return nPosicionesDecimales; }

set { nPosicionesDecimales = value; }

}

//....

}

Listado 1

Listado 2

Page 16: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

16

dnm.plataforma.net<<

Finalmente, escribiremos el méto-do InitializeEditingControl, que seocupará, como su nombre indica, deobtener una instancia del control a usarpara editar la celda, así como de inicia-lizar sus propiedades a partir de los valo-res que hemos pasado al objeto colum-na, al que accedemos mediante la pro-piedad OwningColumn.

También controlaremos posiblesproblemas tales como la inexistencia devalores para la celda, o que el valor nose halle en el intervalo numérico per-mitido. Si se cumple alguna de estascondiciones, generaremos una excep-ción, asignando explícitamente un valorpara la celda, como puede verse en ellistado 3.

La clase NumArribaAbajo Edi-tingControlY llegamos por fin a esta clase, quecomo hemos mencionado anterior-mente, es la que hace posible que, alheredar del control que especifiquemos,una instancia del mismo sea alojada enla celda para editar su valor.

Adicionalmente, mediante la imple-mentación de los miembros pertene-cientes a la interfaz IDataGridViewEdi-tingControl, podremos llevar a cabo

La clase que implementa IDataGridViewEditingControlproporcionará la funcionalidad

necesaria que actuará depuente entre el control deedición y la celda que lo

contiene

class NumArribaAbajoCell : DataGridViewTextBoxCell{

// obtener el tipo de control utilizado para editar la celdapublic override Type EditType{

get { return typeof(NumArribaAbajoEditingControl); }}

// obtener el tipo de dato que es editado en la celdapublic override Type ValueType{

get { return typeof(Decimal); }}

// establecer el valor por defecto para una nueva celdapublic override object DefaultNewRowValue{

get { return 0; }}

// crear y alojar en la celda una instancia del control// utilizado para editar el valor de la celdapublic override void InitializeEditingControl(int rowIndex,

object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)

{base.InitializeEditingControl(rowIndex,

initialFormattedValue, dataGridViewCellStyle);

// obtener el control que usaremos para editar el valor de la celdaNumArribaAbajoEditingControl ctlEditorCelda =

(NumArribaAbajoEditingControl)DataGridView.EditingControl;

// obtener el objeto columna propietario de la celda que vamos a editarNumArribaAbajoColumn colNumArribaAbajo =

(NumArribaAbajoColumn)this.OwningColumn;

// asignar valor a las propiedades del control editorctlEditorCelda.Minimum = colNumArribaAbajo.Minimo;ctlEditorCelda.Maximum =

colNumArribaAbajo.Maximo == 0 ? 100 : colNumArribaAbajo.Maximo;ctlEditorCelda.Increment =

colNumArribaAbajo.Incremento == 0 ? 1 : colNumArribaAbajo.Incremento;ctlEditorCelda.ThousandsSeparator = colNumArribaAbajo.SeparadorMiles;ctlEditorCelda.DecimalPlaces = colNumArribaAbajo.PosicionesDecimales;ctlEditorCelda.UpDownAlign = colNumArribaAbajo.AlineacionFlechas;ctlEditorCelda.TextAlign = colNumArribaAbajo.AlineacionTexto;ctlEditorCelda.BackColor = colNumArribaAbajo.ColorFondo;

// comprobar si el valor de la celda que debemos editar// está en el rango admisible por el control NumericUpDownif (this.Value == DBNull.Value){

ctlEditorCelda.Value = 0;}else{

if (((decimal)this.Value >= ctlEditorCelda.Minimum) &&((decimal)this.Value <= ctlEditorCelda.Maximum))

{ctlEditorCelda.Value = (decimal)this.Value;

}else{

this.RaiseDataError(new DataGridViewDataErrorEventArgs(new Exception(

Page 17: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

17

dnm.plataforma.net<<

varias acciones, tales como el acceso alcontrol DataGridView que actúa comocontenedor de la celda; la fila sobre la cualse va a realizar la edición; las operacionesde teclado que deberán ser manejadas porel propio control de edición en lugar dela celda contenedora, y un largo etcéte-ra. Veamos una muestra en el listado 4.

Cabe destacar, en el apartado visualde este control, que si asignamos unestilo a la columna que lo contiene, laspropiedades de dicho estilo no se apli-carán directamente al control ubicadoen la celda.

La solución que a priori podríamospensar en desarrollar consistiría en lacreación, dentro de la clase columna, delas propiedades necesarias que poste-riormente pasaríamos a la clase de la cel-da; esta última se encargaría de asignar

string.Format(@”Valor {0} incorrecto.Rango admisible de valores de {1} a {2}”, this.Value, ctlEditorCelda.Minimum, ctlEditorCelda.Maximum)),this.ColumnIndex, this.RowIndex,DataGridViewDataErrorContexts.Display));

this.Value = ctlEditorCelda.Minimum;}

}}

}

class NumArribaAbajoColumn :

DataGridViewColumn

{

//....

private Color clrColorFondo;

public Color ColorFondo

{

get { return clrColorFondo; }

set { clrColorFondo = value; }

}

//....

}

class NumArribaAbajoCell :

DataGridViewTextBoxCell

{

//....

public override void

InitializeEditingControl(

int rowIndex,

object initialFormattedValue,

DataGridViewCellStyle

dataGridViewCellStyle)

{

//....

ctlEditorCelda.BackColor =

colNumArribaAbajo.ColorFondo;

}

//....

}

Listado 3

class NumArribaAbajoEditingControl : NumericUpDown, IDataGridViewEditingControl{

// camposprivate DataGridView oDGV;private int nIndiceFila;private bool bValorCambiado = false;

public DataGridView EditingControlDataGridView{

get { return oDGV; }set { oDGV = value; }

}

public int EditingControlRowIndex{

get { return nIndiceFila; }set { nIndiceFila = value; }

}

public bool EditingControlWantsInputKey(Keys keyData,bool dataGridViewWantsInputKey)

{// establecer las pulsaciones de teclado// que el control alojado en la celda podrá utilizarswitch (keyData & Keys.KeyCode){

case Keys.Up:case Keys.Down:case Keys.Left:case Keys.Right:case Keys.Home:case Keys.End:

return true;

default:return false;

}}

protected override void OnValueChanged(EventArgs e){

bValorCambiado = true;this.EditingControlDataGridView.NotifyCurrentCellDirty(true);base.OnValueChanged(e);

}//....

}

Listado 4 Listado 5

Page 18: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

18

dnm.plataforma.net<<

las mencionadas propiedades al controlen su método InitializeEditingCon-trol. El listado 5 muestra esta situaciónaplicada a la propiedad BackColor.

Sin embargo, existe un mediomucho más adecuado, creado ex pro-feso para que el control editor de lacelda pueda obtener las propiedadesque necesita del estilo asignado a lacolumna. Consiste en implementar elmétodo ApplyCellStyleToEditingCon-trol de la interfaz, que recibe un pará-metro conteniendo el estilo pertene-ciente a la columna, del cual tomare-mos aquellos valores que necesitemospara asignarlos a las propiedades delNumericUpDown alojado en la celda (verlistado 6).

Empleando la nueva columnaen el DataGridViewEs momento de hacer uso práctico detodo el código que hemos desarrolla-do. Para ello, dentro del formulario delproyecto sobre el que estamos traba-jando, añadiremos un control Data-GridView, que rellenaremos con algu-nos campos de la tabla DimProduct, per-teneciente a la base de datos Adventu-reWorksDW. En concreto, será el campo

ListPrice el que editaremos mediantenuestra columna personalizada.

Debido a que la consulta SQL quepasamos al DataGridView ya contiene elcampo ListPrice, en primer lugar eli-minaremos de la cuadrícula la colum-na que por defecto crea el control paraeste campo. A partir de dicho punto ins-tanciaremos un objeto de nuestra jerar-

quía de clases, configurando las pro-piedades intrínsecas de la columna, perotambién las correspondientes al controlNumericUpDown de edición. Por otra par-te, crearemos un estilo para la colum-na, cuyos valores veremos igualmentereflejados al editarla.

Como paso final, asignaremos a unade las celdas un valor superior al rango

class NumArribaAbajoEditingControl : NumericUpDown, IDataGridViewEditingControl

{//....public void

ApplyCellStyleToEditingControl(DataGridViewCellStyle

dataGridViewCellStyle){// aplicar al control de edición // de la celda las propiedades // del estilo de la celdathis.Font = dataGridViewCellStyle.Font;

this.BackColor = dataGridViewCellStyle.ForeColor;

this.ForeColor = dataGridViewCellStyle.BackColor;

}//....

}

Listado 6

private void Form1_Load(object sender, EventArgs e)

{

//....

// eliminar columna original

this.dataGridView1.Columns.Remove(“ListPrice”);

// crear columna para edición personalizada

NumArribaAbajoColumn colListPrice = new NumArribaAbajoColumn();

colListPrice.Name = “colListPrice”;

colListPrice.DataPropertyName = “ListPrice”;

colListPrice.HeaderText = “Precio producto”;

colListPrice.Maximo = 3000;

colListPrice.Incremento = 2;

colListPrice.SeparadorMiles = true;

colListPrice.PosicionesDecimales = 3;

colListPrice.AlineacionTexto = HorizontalAlignment.Right;

// crear estilo para la nueva columna

DataGridViewCellStyle styEstilo = new DataGridViewCellStyle();

styEstilo.Alignment = DataGridViewContentAlignment.MiddleCenter;

styEstilo.BackColor = Color.LightBlue;

styEstilo.SelectionBackColor = Color.GreenYellow;

styEstilo.SelectionForeColor = Color.Firebrick;

styEstilo.Font = new Font(“Tahoma”, 10, FontStyle.Bold);

// aplicar estilo a columna

colListPrice.DefaultCellStyle = styEstilo;

// agregar nueva columna al grid

this.dataGridView1.Columns.Add(colListPrice);

// modificar una celda, introducir un valor

// mayor del rango soportado por el control de edición

this.dataGridView1.Rows[2].Cells[“colListPrice”].Value = 3500;

}

private void dataGridView1_DataError(object sender,

DataGridViewDataErrorEventArgs e)

{

MessageBox.Show(“Columna: “ +

this.dataGridView1.Columns[e.ColumnIndex].HeaderText + “\n” +

“Fila: “ + (e.RowIndex + 1) + “\n” +

“Mensaje de error: “ + e.Exception.Message,

“Error de edición de celda”);

}

Listado 7

Page 19: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

permitido por el control de edición, loque nos permitirá que nuestra clasedesencadene el evento DataError de lacuadrícula de datos en el caso de queeditemos dicha celda. Todo ello lovemos en el listado 7.

La figura 1 muestra el control enpleno proceso de edición.

Alojando controles no directa-mente editables

En la columna que acabamos de cre-ar, el usuario puede introducir los valo-res en la celda utilizando las flechas delNumericUpDown, o bien tecleándolosdirectamente.

Habitualmente, el comportamien-to del control ubicado en la celda per-mite que su contenido sea editado, perotambién es posible utilizar controlesbasados la selección de un valor, sinposibilidad de editarlo. Como ejemplo,tenemos la clase DataGridViewComboBox-Column, perteneciente al propio .NETFramework.

Pero el objetivo del presente artí-culo es la personalización de esteaspecto del control DataGridView, porlo que podemos recurrir a desarrollaruna columna cuyas celdas contenganun control con estas características,como puede ser MonthCalendar, el cualofrece un calendario donde el usuariosólo puede seleccionar fechas, no exis-tiendo la posibilidad de escribir suvalor.

Por cuestiones de espacio no esposible ofrecer el código al completopara esta nueva columna personaliza-da, aunque como ya hemos menciona-do, todo el código tratado en este artí-culo puede ser descargado del sitio Webde la revista.

Dado que MonthCalendar es un con-trol que al ser alojado en las celdas deuna columna ocupará un mayor espa-cio en el momento de la edición, ten-dremos que realizar los cálculos opor-tunos que nos permitan aumentar lasdimensiones de la celda sobre la que seproduzca la edición del valor, restau-rando la celda al tamaño inicial una vezconcluida la operación, como vemos enel listado 8.

dotN

etM

anía

<<

19

dnm.plataforma.net<<

public class CalendarioMensualColumn : DataGridViewColumn{

//....}

public class CalendarioMensualCell : DataGridViewTextBoxCell{

//....public override void InitializeEditingControl(int rowIndex,

object initialFormattedValue, System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle)

{base.InitializeEditingControl(rowIndex,

initialFormattedValue, dataGridViewCellStyle);

CalendarioMensualEditingControl ctlEditorCelda =(CalendarioMensualEditingControl)DataGridView.EditingControl;

CalendarioMensualColumn colCalendarioMensual =(CalendarioMensualColumn)this.OwningColumn;

// guardar las coordenadas de la celda (fila y columna)ctlEditorCelda.EditingControlRowIndex = rowIndex;ctlEditorCelda.IndiceColumna = this.OwningColumn.Index;

// guardar las dimensiones originales de la celdactlEditorCelda.AlturaCelda =

this.DataGridView.Rows[rowIndex].Height;ctlEditorCelda.AnchuraCelda =

this.DataGridView.Columns[this.OwningColumn.Index].Width;

// establecer nueva dimensión para la celda,// de forma que visualicemos el control editor al completothis.DataGridView.Rows[rowIndex].Height =

ctlEditorCelda.Size.Height;this.DataGridView.Columns[this.OwningColumn.Index].Width =

ctlEditorCelda.Size.Width;

// comprobar la fecha a pasar al control de ediciónif (this.Value == DBNull.Value){

ctlEditorCelda.SelectionEnd = DateTime.Today;}else{

ctlEditorCelda.SelectionEnd = (DateTime)this.Value;}

}

Figura 1. Celda del DataGridView editada mediante un NumericUpDown

Page 20: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

20

dnm.plataforma.net<<

En la clase CalendarioMensualEdi-tingControl declaramos un conjunto depropiedades para almacenar la posicióny tamaño de la celda. Estas propiedadeslas emplearemos en el método Calenda-rioMensualCell.InitializeEditingCon-

trol, cuando el control de edición seacreado. Para detectar el momento en elque el usuario termina de editar el con-trol, reemplazaremos el método OnLost-Focus en la clase derivada de MonthCa-lendar, dentro del cual devolveremos lacelda a su tamaño original.

El listado 9 muestra la creación en elformulario de un objeto correspondien-te a esta nueva columna personalizada.

La figura 2 muestra el control Data-GridView editando este nuevo tipo decelda que acabamos de crear.

Vamos concluyendoEsperamos que las capacidades deextensión del control DataGridView, enlos aspectos de creación de columnaspersonalizadas expuestos en este artí-culo, hayan despertado el interés dellector, animándole a desarrollar sus pro-pias columnas para resolver aquellosaspectos concretos no disponibles “deserie” en este control. Un saludo atodos.

}

public class CalendarioMensualEditingControl : MonthCalendar,IDataGridViewEditingControl

{// campos//....private int nIndiceFila;private int nIndiceColumna;private int nAlturaCelda;private int nAnchuraCelda;//....// propiedades particularespublic int IndiceColumna{

get { return nIndiceColumna; }set { nIndiceColumna = value; }

}

public int AlturaCelda{

get { return nAlturaCelda; }set { nAlturaCelda = value; }

}

public int AnchuraCelda{

get { return nAnchuraCelda; }set { nAnchuraCelda = value; }

}

// métodos reemplazados//....protected override void OnLostFocus(System.EventArgs e){

base.OnLostFocus(e);

// restaurar celda a su tamaño originaloDGV.Rows[nIndiceFila].Height = nAlturaCelda;oDGV.Columns[nIndiceColumna].Width = nAnchuraCelda;

}//....

}

Listado 8

Figura 2. Columna para editar fechas mediante un control MonthCalendar.

// eliminar la columna previathis.dataGridView1.Columns.Remove(

“EndDate”);

// crear columna personalizada para // el campo EndDateCalendarioMensualColumn colEndDate =

new CalendarioMensualColumn();colEndDate.Name = “colEndDate”;colEndDate.DataPropertyName =

“EndDate”;colEndDate.HeaderText =

“Fecha final”;colEndDate.MostrarFechaActual =

false;colEndDate.MostrarNumerosSemana =

true;this.dataGridView1.Columns.Add(

colEndDate);

Listado 9

Page 21: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 22: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Si bien en entregas anteriores [2, 3] mostramoslas diferentes formas de mapear en el Marco deentidades uno de los conceptos fundamentales deldiseño orientado a objetos, la herencia, a partirde esta entrega presentaremos los recursos queofrece el Marco de entidades para reflejar otra delas dependencias comunes entre clases, la agre-gación o composición, centrándonos inicialmen-te en el caso de relaciones 1:1 en las que el atri-buto (la parte del todo) es de un tipo complejo(compuesto). El ejemplo típico de esta situaciónes el de la relación entre un Cliente y su Direc-ción, ésta última concebida como el conjunto deelementos tales como calle, número, población,código postal, etc. En un sistema orientado a obje-tos, indudablemente nos interesaría tener dos enti-dades bien diferenciadas; en el mundo de las basesde datos relacionales, este tipo de relaciones serepresenta generalmente de una de dos manerasdiferentes:

a) “Aplanando” los datos de la dirección, ycolocando sus diferentes campos al mismonivel que otros atributos “independientes”del cliente, como el código o el nombre(figura 1).

b) Situando los datos de la dirección en unatabla complementaria, a la que se añadeuna clave foránea (que puede servir comoclave primaria también) para establecer la

relación con el cliente correspondiente(figura 2).

Como mostraremos a continuación, el Marcode entidades de ADO.NET hace posible estable-cer los mapeos necesarios en ambos casos, de modoque podamos trabajar al nivel de modelo concep-tual guiándonos siempre por la regla “un clientetiene una dirección”. Si quiere seguir el procesocon nosotros, cree en este momento una aplica-ción de consola que servirá para alojar los mode-los. Deberá instalar la base de datos DNM_EF4, quepuede descargar del sitio Web de la revista.

El Marco de trabajo de entidades de ADO.NET v3.5 (IV)

plataforma.net

En nuestras entregas anteriores hemos venido presentando los dife-rentes mecanismos que ofrece el Marco de entidades de ADO.NET 3.5para permitir la creación y subsiguiente explotación de modelos con-ceptuales mapeados sobre modelos relacionales de bases de datos. Enesta entrega continuaremos explorando esos mecanismos.

Figura 1. Datos de dirección “aplanados”.

Unai Zorrilla esDevelopment Team

Leader de Plain Conceptsy tutor de campusMVP.

MVP desde 2004,colabora activamente con

Microsoft en eventos dearquitectura y

desarrollo, así como engiras de productos. Autor

del libro "Modelandoprocesos de negocio con

Workflow Foundation".

Octavio Hernández esMentoring Team Leader

de Plain Concepts, editortécnico de dotNetManía y

tutor de campusMVP. Es MVP de C# desde2004, MCSD y MCT.

Autor del libro "C# 3.0 yLINQ".

Unai ZorrillaOctavio Hernández

Page 23: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

23

dnm.plataforma.net<<

Mapeo en caso de datos “aplanados”En el caso de que nuestro modelo relacional dis-ponga las direcciones de los clientes junto con losdemás datos de éstos en una única llamada Cliente1,los pasos a dar para definir el modelo serían lossiguientes:

1. Agregue al proyecto un nuevo modelo de datos deADO.NET; llámelo Modelo1. Genere el modelo apartir de la base de datos DNM_EF4, incluyendo úni-camente la tabla Cliente1. Indique DNM_EF4_Modelo1como espacio de nombres para las clases resultantes.

2. En el momento en que este artículo se escribe, eldiseñador visual aún no ofrece un soporte com-pleto para este tipo de implementación de tiposcomplejos. Abra el modelo de datos utilizando eleditor XML, y en la sección correspondiente almodelo conceptual (CSDL) añada el elemento Com-plexType del listado 1, que define el tipo comple-jo TipoDireccion.

3. Modifique la definición de la entidad Cliente1 paraque haga uso del tipo recién definido, como semuestra en el listado 2.

4. Para completar el trabajo, tenemos que especifi-car, en la sección de mapeado C-S, cómo se corres-ponden las columnas físicas de la base de datos conla entidad y tipo complejo que acabamos de defi-nir en el CSDL. Para ello, modificaremos el mapeode la entidad Cliente1 según se muestra en el lis-tado 3, envolviendo los diferentes elementos aso-

Figura 2. Datos de dirección en tabla relacionada.

<ComplexType Name=”TipoDireccion” a:Access=”Public”

xmlns:a=”http://schemas.microsoft.com/ado/2006/04/

codegeneration”>

<Property Name=”Direccion” Type=”String”

Nullable=”false” MaxLength=”50” />

<Property Name=”Poblacion” Type=”String”

MaxLength=”30” />

<Property Name=”CodigoPostal” Type=”String”

MaxLength=”15” />

<Property Name=”Provincia” Type=”String”

Nullable=”false” MaxLength=”30” />

</ComplexType>

Listado 1. Definición del tipo complejo TipoDireccion

<EntityType Name=”Cliente1”>

<Key>

<PropertyRef Name=”ID” />

</Key>

<Property Name=”ID” Type=”Int32”

Nullable=”false” />

<Property Name=”Nombre” Type=”String”

Nullable=”false” MaxLength=”50” />

<Property Name=”Email” Type=”String”

MaxLength=”50” />

<Property Name=”Direccion”

Type=”DNM_EF4_Modelo1.TipoDireccion”

Nullable=”false” />

</EntityType>

Listado 2. Nueva definición de Cliente1 en CSDL.

Desde nuestro lenguaje de programación accederemos a las

direcciones y sus diferentes atributos mediante la notación

tradicional de punto

Page 24: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

24

dnm.plataforma.net<<

ciados a las direcciones dentro de unelemento ComplexProperty.

Como ya es habitual, presentaremosahora un pequeño ejemplo de cómo con-sultar con LINQ y actualizar el modeloobtenido. El listado 4 cumple ese come-tido. En él se puede apreciar cómo des-de nuestro lenguaje de programaciónaccedemos a la dirección de los clientesy sus distintos atributos mediante la nota-ción tradicional de punto, tan familiar enla programación orientada a objetos.

Mapeo en caso de tabla comple-mentariaEn el caso de que nuestro modelo rela-cional disponga las direcciones de losclientes en una tabla complementaria,según el diagrama de la figura 2, la secuen-cia de pasos a seguir sería la siguiente:

1. Agregue al proyecto un nuevomodelo de datos de ADO.NET; llá-melo Modelo2. Genere el modelo apartir de la base de datos DNM_EF4,incluyendo las tablas Cliente2 yDireccion2. Indique en este casoDNM_EF4_Modelo2 como espacio denombres para las clases resultantes.El modelo de entidades generadoautomáticamente se muestra en lafigura 3.

2. En este caso, una parte del trabajo sípuede hacerse ya mediante el diseña-dor gráfico, oportunidad que aprove-charemos. Para ello, corte las propie-dades Direccion, Poblacion, Codigo-Postal y Provincia de la entidadDireccion2, como se muestra en lafigura 4, y péguelas en la entidadCliente2. Esto equivale a haber pasa-do los elementos XML que definendichas propiedades de la definición deuna entidad en el esquema CSDL ala otra.

3. Ahora debemos indicar cómo mape-ar cada una de estas nuevas propie-dades del cliente a columnas detablas del almacén relacional. Paraello, hay seleccionar la entidadCliente2, abrir su ventana de Deta-lles de mapeo desde el menú con-

<EntityTypeMapping TypeName=”IsTypeOf(DNM_EF4_Modelo1.Cliente1)”>

<MappingFragment StoreEntitySet=”Cliente1”><ScalarProperty Name=”ID” ColumnName=”ID” /><ScalarProperty Name=”Nombre” ColumnName=”Nombre” /><ScalarProperty Name=”Email” ColumnName=”Email” />

<ComplexProperty Name=”Direccion” TypeName=”DNM_EF4_Modelo1.TipoDireccion”IsPartial=”true”>

<ScalarProperty Name=”Direccion” ColumnName=”Direccion” /><ScalarProperty Name=”Poblacion” ColumnName=”Poblacion” /><ScalarProperty Name=”CodigoPostal” ColumnName=”CodigoPostal” /><ScalarProperty Name=”Provincia” ColumnName=”Provincia” />

</ComplexProperty>

</MappingFragment>

</EntityTypeMapping>

Listado 3. Nuevo mapeo de la entidad Cliente1.

using System;using System.Collections.Generic;using System.Linq;

namespace TiposComplejos{

using DNM_EF4_Modelo1;

class Program{

static void Main(string[] args){

using (DNM_EF4Entities1 ctx = new DNM_EF4Entities1()){

// nuevo cliente...Cliente1 c = new Cliente1();c.ID = 0;c.Nombre = “Andrés Galarraga”;c.Email = “[email protected]”;c.Direccion.Direccion = “Arroyo Fontarrón 103, 2º”;c.Direccion.Poblacion = “Madrid”;c.Direccion.CodigoPostal = “28030”;c.Direccion.Provincia = “Madrid”;ctx.AddToCliente1(c);ctx.SaveChanges(); // grabar en BD

// codigos postales de residentes en prov. Madridvar q = (from x in ctx.Cliente1

where x.Direccion.Provincia == “Madrid”select x.Direccion.CodigoPostal).Distinct();

// ejecutar la consultaforeach (var s in q) Console.WriteLine(s);

}}

}}

Listado 4. Utilización del modelo DNM_EF4_Modelo1.

Page 25: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

25

dnm.plataforma.net<<

textual, agregar la tabla Direccion2 y establecer lascorrespondencias, como se muestra en la figura 5.

4. Ahora podemos eliminar la entidad Direccion2 delmodelo conceptual, en el que sin dudas no “pin-ta” nada.

En este punto, ya habremos logrado combinar enuna única entidad lógica datos que provienen físicamentede distintas tablas –una técnica que en los blogs del equi-po de ADO.NET [4] se conoce bajo el término “Mul-tiple Tables, Single Entity” (MTSE)–. Podríamos dete-nernos aquí, y ya tendríamos un modelo en el que elMarco de entidades será capaz de implementar elencuentro entre tablas que se requiere para construiruna o más instancias de la entidad Cliente2, así comotambién de generar automáticamente las sentencias

INSERT, UPDATE y DELETEnecesarias para inser-tar, modificar o borrar, respectivamente, uncliente. El código del listado 5 es un ejem-plo de ello; en comentarios se muestran lassentencias SQL que se envían al almacén dedatos en los momentos adecuados.

El problema de detenernos aquí es queel concepto de Dirección como tipo com-plejo no estaría presente; tendríamos sim-plemente cuatro propiedades adicionalesindependientes en Cliente2. Lo más ade-cuado sería muy probablemente repetir lospasos que hemos dado en la sección ante-rior para incorporar también a este mode-

lo el tipo complejo TipoDireccion, lo que dejamos al lec-tor interesado en calidad de ejercicio propuesto. Unavez hecho esto, podremos operar sobre este segundomodelo de un modo muy similar al aplicado en el pri-mer modelo (listado 4).

ConclusionesEn este artículo hemos descrito otros dos mecanis-mos soportados por el Marco de entidades deADO.NET para permitirnos crear modelos concep-tuales mapeados a bases de datos relacionales. En pró-ximas entregas continuaremos describiendo otras posi-bilidades que nos ofrece el Marco de entidades parael modelado conceptual.

Figura 3. Modelo conceptual inicial en caso de tabla complementaria

Figura 5. Detalles del mapeo de la entidad Cliente2

Page 26: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

BibliografíaHernández, Octavio y Zorrilla, Unai “El Marco de trabajo de entidades de ADO.NET 3.5”, en dotNetManía nº44, enero de 2007.Zorrilla, Unai y Hernández, Octavio “El Marco de trabajo de entidades de ADO.NET 3.5 (II)”, en dotNetManíanº 45, febrero de 2007.Zorrilla, Unai y Hernández, Octavio “El Marco de trabajo de entidades de ADO.NET 3.5 (III)”, en dotNetManíanº 46, marzo de 2007.Blog del equipo de ADO.NET Entity Framework, en http://blogs.msdn.com/adonet.

[1]

[2]

[3]

[4]

using System;using System.Collections.Generic;using System.Linq;

namespace TiposComplejos{

using DNM_EF4_Modelo1;class Program{

static void Main(string[] args){

// segundo modelousing (DNM_EF4Entities2 ctx = new DNM_EF4Entities2()){

// nuevo cliente...Cliente2 c = new Cliente2();c.ID = 0;c.Nombre = “Andrés Galarraga”;c.Email = “[email protected]”;c.Direccion = “Arroyo Fontarrón 103, 2º”;c.Poblacion = “Madrid”;c.CodigoPostal = “28030”;c.Provincia = “Madrid”;ctx.AddToCliente2(c);ctx.SaveChanges(); // grabar en BD

// Salida del SQL PROFILER:// exec sp_executesql N’INSERT [dbo].[Cliente2]([Nombre], [Email])// VALUES (@0, @1)// SELECT [ID]// FROM [dbo].[Cliente2]// WHERE @@ROWCOUNT > 0 and [ID] = scope_identity()’,// N’@0 nvarchar(16),@1 nvarchar(14)’,@0=N’Andrés Galarraga’,@1=N’[email protected]’// exec sp_executesql N’INSERT [dbo].[Direccion2]([ID], [Direccion], [Poblacion], [CodigoPostal], [Provincia])// VALUES (@0, @1, @2, @3, @4)’,// N’@0 int,@1 nvarchar(24),@2 nvarchar(6),@3 nvarchar(5),@4 nvarchar(6)’,@0=1,@1=N’Arroyo Fontarrón 103, 2º’,// @2=N’Madrid’,@3=N’28030’,@4=N’Madrid’

// nombres y códigos postales de residentes en prov. Madridvar q = (from x in ctx.Cliente2

where x.Provincia == “Madrid”select new { x.Nombre, x.CodigoPostal });

// ejecutar la consultaforeach (var x in q)

Console.WriteLine(x.Nombre + “ “ + x.CodigoPostal);// Salida del SQL PROFILER:// SELECT 1 AS [C1], // [Extent1].[Nombre] AS [Nombre], // [Extent2].[CodigoPostal] AS [CodigoPostal]// FROM [dbo].[Cliente2] AS [Extent1]// INNER JOIN [dbo].[Direccion2] AS [Extent2] ON [Extent1].[ID] = [Extent2].[ID]// WHERE N’Madrid’ = [Extent2].[Provincia]

}}

}}

Listado 5. Ejemplo del mapeo “Multiple Tables, Single Entity”

dotN

etM

anía

<<

26

Page 27: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

27

Introducción

Hace unos cuantos añitos que arrancó la World WideWeb, pero si miramos atrás y vemos algún pantalla-zo de una página Web antigua, nos podemos quedarsorprendidos… ¡Cuánto hemos evolucionado! Aho-ra tenemos Javascript/DHTML/DOM para modi-ficar la página en cliente, AJAX para hacer peticio-nes fuera de banda sin tener que enviar el formula-rio completo al servidor, pero… ¿alguien se atreveríaa decir que una aplicación Web puede tener mejorinterfaz que una de escritorio? ¿A qué se debe esto?A un problema de raíz: HTML no fue diseñado paralo que se quiere hacer en estos momentos; se ha idoforzando y extendiendo el lenguaje para llegar máslejos, los fabricantes de software de desarrollo hanintentado rebajar la complejidad a base delibrerías/frameworks y lenguajes “mágicos” que ocul-tan gran parte de la complejidad que implica haceruna aplicación Web de última generación. ¿Acasoalguien se plantea, hoy en día, implementar una apli-cación AJAX sin usar ningún tipo de ayuda?

El problema que tenemos es que los usuariosseguimos pidiéndole más a la Web, y surge la dudade si podremos seguir dándole vueltas de tuerca aese viejo amigo llamado HTML. Aquí es dondeentra un nuevo concepto llamado RIA (Rich Inter-net Applications), es decir, aplicaciones Web queincorporan características de aplicaciones de escri-torio, como por ejemplo: tener la lógica de fun-cionamiento/estado en cliente, comunicarse deforma ligera con el servidor, implementar carac-terísticas avanzadas que normalmente no están

presentes en entornos Web (drag & drop, anima-ciones…). La apuesta de Microsoft por RIA sellama Silverlight.

¿Qué es Silverlight 2.0? Definición informal

Es un plug-in que se ejecuta en un navegadorWeb. Podemos elegir entre usarlo como base paranuestra aplicación o como complemento a nues-tro sitio Web actual (incrustado en un fragmentode nuestras páginas). Nos permite crear todo tipode aplicaciones: basadas en formularios, con mane-jo de gráficos, cuadros de mando (ver figura 1),generación de diagramas, etc. Todo esto se reali-

Silverlight 2.0: ¡Revolución!

plataforma.net

Braulio Díez trabaja en Avanade,

es colaborador habi-tual de dotNet-

Manía y administra elsitio tipsdotnet.

Reyes Garcíaha sido consultora

"todo terreno". Hoyse dedica al gratifican-

te mundo de ladocencia.

Silverlight 2.0 es la palabra de moda. Seguro que, aun estando en beta, haescuchado algo acerca de esta tecnología en los últimos meses… En esteartículo veremos qué hace de la versión 2.0 un producto tan esperado, cómose desarrolla con él y cómo integrarlo en nuestras aplicaciones Web.

Figura 1. Ejemplo de cuadro de mandos generado con Silverlight 2.0

Braulio DíezReyes García

Page 28: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

28

za usando un nuevo lenguaje de mar-cas (XAML), de una forma fácil, poten-te, bien estructurada, ¡pudiendo desa-rrollar bajo .NET en la parte cliente!

¿Qué es Silverlight 2.0? Definición formal

Wikipedia nos dice algo así como:Plug-in multimedia para navegadoresWeb. Subconjunto de WPF (WindowsPresentation Foundation) que permiteejecutar en un navegador Web anima-ciones, mostrar gráficos vectoriales yvisualizar vídeo. Estará disponible paraWindows y Mac OS-X; para Linux hayun proyecto open source paralelo llama-do Moonlight, que se espera sea com-patible con Silverlight.

Silverlight se presenta como la alter-nativa a Adobe Flash / Flex.

¿Otro Flash? ¿Qué tiene esto de revo-lucionario?

No es solo “otro” Flash, Flex oHTML: es un plug-in que nos permi-te tener una interfaz de usuario avan-zada, sin las restricciones y problemas

que otras tecnologías nos acarrean.Algunos de los puntos fuertes de Sil-verlight 2.0 son:• Podemos elegir entre un amplio aba-

nico de lenguajes para desarrollar,tanto compilados como interpreta-dos: C#, Visual Basic, Iron Python,Iron Ruby…

• Es posible desarrollar en un mismolenguaje en cliente y en servidor (acce-so a servicios). Gracias a esto la curvade aprendizaje se reduce, y tenemosun mismo entorno de desarrollo.

• Tenemos una versión reducida de.NET Framework disponible encliente. Por ejemplo: ¿qué le parecedisponer de LINQ to XML en clien-te? ¿Y enlace a datos?

• Al recaer más lógica de la aplicaciónen la parte cliente descargamos laparte servidora, siendo nuestros sis-temas más escalables.

• HTML es un lenguaje de marcasque se ha ido forzando para adap-tarlo a los nuevos tiempos y reque-rimientos del público. Desarrollarsitios avanzados con DHTML yJavascript se ha convertido en unatarea muy complicada, que requie-re adquirir librerías de terceros,

adaptar el código para que funcio-ne en diferentes navegadores…XAML es un lenguaje de marcasmoderno y extensible, y al correréste sobre un plug-in tenemos unaúnica interpretación del mismo, yno tenemos que preocuparnos derealizar adaptaciones a los diferen-tes exploradores.

• Si programamos en ASP.NET conWeb Forms, tenemos que pasar decontroles de servidor a controlesHTML y viceversa. Esto hace quenuestras páginas sean difíciles demanipular en cliente vía Javascript,y podemos tener problemas de ren-dimiento (ViewState). Silverlight 2.0implementa controles estándares queson manipulados directamente en elcliente.

• Las aplicaciones Silverlight agrupanlos recursos en ficheros ZIP que seenvían comprimidos al cliente,teniendo un tiempo de descargaóptimo.

• Es posible editar un fichero XAMLtanto con Visual Studio como coneditores de texto estándares e inclu-so utilizando herramientas paradiseñadores gráficos (Expression).

Silverlight 1.0 tiene varios hándicaps,como que se programa solamente conJavascript, no incorpora controles deusuario estándar, etc.

¿Por qué salió al mercado? Tie-ne un reproductor de vídeo poten-te (soporta el códec de alta defini-ción VC-1, estándar para Blue-ray yHD-DVD), y también sirve comoherramienta de market ing: paracuando salga la versión 2.0, muchagente tendrá ya la 1.0 instalada y sela bajará de forma automática comouna actualización.

¿Y Silverlight 1.0?

Page 29: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

29

Esto permite a desarrolladores y gra-fistas trabajar codo con codo.

• Los controles estándar que incorpo-ra Silverlight están pensados desdeel punto de vista del desarrollador.Cualquier programador de WindowsForms/ASP.NET/WPF se familia-rizará rápidamente con ellos.

• Será compatible con tecnologíasmóviles; recientemente, Nokia haanunciado que lo incluirá en algunosde sus modelos.

Pero… alguna pega tendrá, ¿no?

Nada es perfecto en este mundo, lasprincipales desventajas que tiene esteproducto son:

• Está disponible para plataformas Macy Windows, pero no para Linux.Aunque el mismo grupo que desa-rrolló el proyecto Mono está reali-zando una adaptación, con codenameMoonlight, que cuenta con el sopor-te de Microsoft.

• Se encuentra actualmente en fasebeta; en proyectos a muy corto pla-zo no podemos tomarlo comoopción de desarrollo. Se espera queeste verano tengamos la versióndefinitiva.

Arquitectura y funcionamientoVamos ver cómo se estructura unaaplicación de este tipo, qué herra-mientas tenemos disponibles paradesarrollar y, para abrir boca, realiza-remos un pequeño ejemplo con el queiniciaremos nuestras andanzas en estenuevo mundo.

¿Cómo se estructura una aplicación Silverlight?

Una de las mejores formas de asimilarla arquitectura de una solución Silverlightes comparándola con la de un viejo cono-cido nuestro, ASP.NET (ver figura 2).

En ASP .NET tenemos:

En cliente:• HTML.• Código cliente (Javascript).

En servidor: • Code behind (.NET: C#, VB,

etc.).• Servicios (.NET: C#, VB.NET,

etc.).

En Silverlight tenemos:

En cliente:• Contenedor (página HTML).• XAML (dentro de la página

HTML).• Code behind (.NET: C#, VB.NET,

etc.).En servidor:

• Servicios (.NET: C#, VB.NET,etc.)

Figura 2. Analogías ASP.NET–Silverlight

Figura 3. Herramientas para trabajar con Silverlight

Page 30: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

30

Todo esto es muy interesante… ¿quéherramientas tenemos disponibles?

Si bien un desarrollador puedeimplementar una aplicación utilizandoVisual Studio 2008 tanto para editar elXAML como el code behind, Microsoftnos permite que grafistas y programa-dores puedan cooperar en armonía,ofreciéndonos herramientas especiali-zadas para cada rol (ver figura 3). Enconcreto tenemos:

Grafistas

• Expression Design: herramienta conla que podemos crear gráficos yexportarlos a formato XAML.

• Expression Blend: con esta otra, ademásde poder crear gráficos, podemos tam-bién crear “formularios” (soltar en elárea de diseño controles de usuario,emplear elementos para definir unlayout, etc.).

Desarrolladores

• Visual Studio 2008: El IDE estátotalmente integrado con Silver-light. Por ejemplo, tenemos Inte-llisense para el XAML y para el codebehind, etc. Ésta y otras caracterís-

ticas nos harán sentirnos como encasa desde el primer día.

• Otros editores: Si bien el compañeroideal de Silverlight para un desarro-llador es Visual Studio, no siempre lovamos a tener disponible (por ejem-plo, en un servidor). Gracias a que losficheros XAML y el code behind sonficheros de texto, podemos abrirloscon cualquier editor estándar (Note-pad, UltraEdit, etc.).

En Silverlight queda claramenteseparado qué parte tiene que tocar un

grafista (XAML) y qué parte es propie-dad del programador (code behind).

Como somos técnicos, elegimosVisual Studio 2008 como herramienta,y nos instalamos el plug-in de la versión2.0 y el SDK de Silverlight 2.0 paraVisual Studio. Todo este material lopodemos descargar del sitio Web oficial,www.silverlight.net. Ahora estamos lis-tos para crear el primer proyecto.

¡Hola Mundo!

Aparquemos la “teoría” y pasemosa implementar un pequeño ejemplo quenos permita comprobar cómo se desa-rrolla con esta nueva tecnología. Paraello, iniciamos Visual Studio 2008, ele-Figura 4. Crear nuevo proyecto

Figura 6. Proyecto generado por Visual Studio

Figura 5. Elegimos crear proyecto Web asociado

Page 31: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 32: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

32

gimos crear un nuevo proyecto (pre-viamente deberemos haber instalado elplug-in de Silverlight 2.0 y el SDK), yelegimos “Silverlight Application” (verfigura 4).

A continuación se nos pregunta siqueremos añadir un proyecto WebASP.NET a la solución; diremos que sí.Esto hace muy fácil desplegar nuestraaplicación Web a un entorno de pro-ducción y nos permite, si hiciese falta,integrarlo con código ASP.NET están-dar (ver figura 5).

Generamos el proyecto, y analiza-mos la solución que ha creado VisualStudio (ver figura 6).

Si ejecutamos el proyecto, veremosuna página vacía. Le añadimos el códi-

go XAML necesario (ver listado 1) paracrear una ventana con la apariencia dela figura 7.

Ahora sí, al ejecutar el proyectoveremos cómo se muestra nuestra ven-tana. Solo falta un pequeño detalle:implementar la lógica que permite alusuario cambiar el texto a mostrar(tecleando en la caja de edición inferiory pulsando en el botón “Cambiar”).

Para ello:• Añadimos un manejador al evento

Click del botón btnCambio en elXAML (ver listado 2).

• Lo implementamos en el code behindde la página (ver listado 3).

Ejecutamos de nuevo, ¡y ya tene-mos nuestra aplicación completa!(figura 8).

Figura 7. Aspecto de “Hola Mundo”

<!— Aquí indicamos, entre otras cosas, el tamaño de página, y el nombre de la —><!— clase que implementa el code behind de la página. —><UserControl x:Class=”HolaMundo.Page”

xmlns=”http://schemas.microsoft.com/client/2007”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”Width=”400” Height=”300”>

<!— Tenemos disponibles tres tipos de layout: —><!— * Canvas: le decimos la posición exacta (X, Y) en la que queremos —><!— mostrar cada control. —><!— —><!— * Stack Panel: los controles se alinean horizontalmente o verticalmente —><!— (útil para visualizar controles como si fueran listas, o galerías de —><!— imágenes). —><!— —> <!— * Grid: parecido a una tabla de HTML pero mucho más potente (es el —><!— que usamos en este ejemplo). —> <Grid x:Name=”LayoutRoot” Background=”White”>

<!— Queremos dos filas de diferente altura. —><Grid.RowDefinitions>

<RowDefinition Height=”70”/><RowDefinition Height=”30”/>

</Grid.RowDefinitions><!— Queremos dos columnas, una para el textbox y otra para el botón. —><Grid.ColumnDefinitions>

<ColumnDefinition Width=”200”/><ColumnDefinition Width=”110”/>

</Grid.ColumnDefinitions>

<!— En la primera fila del grid, mostramos el texto “Hola Mundo”. Utilizamos—><!— para ello un control TextBlock, parámetros a destacar: —><!— —><!— * x:Name es el Identificador del control (por el que podremos —><!— referenciarlo desde el code behind). —><!— —><!— * Grid.Row y Column: posición del Grid en la que queremos mostrar el —><!— texto. ColumnSpan sirve para indicar que la celda ocupe el espacio de —><!— dos columnas. —><TextBlock x:Name=”tbTexto” Text=”¡ Hola Mundo !” Grid.Row=”0” Grid.Column=”0”

Grid.ColumnSpan=”2” FontSize=”40”/>

<!— Dejamos al usuario que cambie el mensaje, tecleando en un TextBox y —><!— pulsando el botón “Cambiar Mensaje”. —> <TextBox x:Name=”txCambio” Grid.Row=”1” Grid.Column=”0”></TextBox><Button x:Name=”btnCambio” Content=”Cambiar Mensaje” Grid.Row=”1”

Grid.Column=”1”/></Grid>

</UserControl>

Listado 1. XAML con el layout de la página

Tradicionalmente, los desarrolladores hantenido una relación de amor/odio conJavascript. Siempre que aparece una nue-va tecnología, resurge esta pregunta/deseo.

Si utilizamos Silverlight como partede una aplicación Web tradicional, ten-dremos que usar Javascript para inte-ractuar entre página HTML y plug-in; nonos queda más remedio que pasar porel aro. Si la base de nuestra aplicaciónes Silverlight, podremos prescindir deJavascript: tenemos todas las herra-mientas necesarias para poder trabajar.

¿Javascript tiene los días contados?

Page 33: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

33

Hemos finalizado con el ejemploy no hemos tocado código alguno delproyecto ASP.NET asociado ¿Paraqué sirve? Nuestro proyecto necesi-ta instanciar el plug-in de Silverlighten un navegador Web para poder eje-cutarse. Visual Studio genera pornosotros el código necesario paravisualizar el plug-in en una aplicaciónASP.NET (fichero HolaMundoTestPa-ge.aspx, ver listado 4), y en una pági-na HTML (fichero HolaMundoTestPa-ge.HTML, ver listado 5).

ConclusiónComo reza el titular de este artículo, Sil-verlight 2.0 tiene todos los visos de pro-

Figura 8 Aplicación completa

<Button x:Name=”btnCambio” Content=”Cambiar Mensaje” Grid.Row=”1” Grid.Column=”1” Click=”btnCambio_Click”/>

Listado 2. Manejador del botón de cambio

/// <summary>/// Cuando se pulsa el botón de cambio, le asignamos lo que hay/// en la caja de texto al TextBlock principal./// </summary>/// <param name=”sender”></param>/// <param name=”e”></param>private void btnCambio_Click(object sender, RoutedEventArgs e){

tbTexto.Text = txCambio.Text;}

Listado 3. Implementación del manejador

<body style=”height:100%;margin:0;”><form id=”form1” runat=”server” tyle=”height:100%;”>

(…)<div style=”height:100%;”><!-- Control de servidor para instanciar el plug-in de Silverlight. --><!-- Parámetros: --><!-- --><!-- * ID: para acceder al control desde el code behind de ASP.NET. --><!-- --><!-- * Source: dónde se encuentra el fichero de recursos de nuestro proyecto --><!-- Silverlight (al estar el proyecto Web enlazado, Visual Studio nos copia --><!-- automaticamente el resultado de la compilación a una carpeta del --><!-- proyecto ASP.NET) . --><!-- --> <!-- * Version: indicamos que el código corre bajo la versión 2.0 de --><!-- Silverlight. --><!-- --> <!-- * Width/Height: lo establecemos al 100 % para que ocupe todo el área --><!-- de la página. --><asp:Silverlight ID=”Xaml1” runat=”server” Source=”~/ClientBin/HolaMundo.xap”

Version=”2.0” Width=”100%” Height=”100%” /></div></form></body>

Listado 4. HolaMundoTest.aspx

Si usamos Silverlight como comple-mento de nuestro sitio Web, tendremosque hablar de “AJAX y Silverlight”.

Si lo usamos como base para nues-tra aplicación, utilizar AJAX deja detener sentido, ya que Silverlight incor-pora unas librerías de comunicaciónmucho más potentes, añadiendoademás la comodidad de poder usar-las desde .NET.

¿AJAX vs. Silverlight?

Silverlight 2.0 tiene todos los visos de provocar una auténtica revolución en el

mundo del desarrollo Web

Click=”btnCambio_Click”

~/ClientBin/HolaMundo.xap

Page 34: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dnm.plataforma.net<<

dotN

etM

anía

<<

34

vocar una auténtica revolución en el mundo del desa-rrollo Web. Ahora que el producto ha pasado de Alfa

a beta, es un buen momento para comenzar a practi-car con esta tecnología. Es un candidato a evaluar paradesarrollos a medio y largo plazo.

<object data=”data:application/x-silverlight,” type=”application/x-silverlight-2-b1” width=”100%” height=”100%”><param name=”source” value=”ClientBin/HolaMundo.xap”/><param name=”onerror” value=”onSilverlightError” /><param name=”background” value=”white” />

<a href=”http://go.microsoft.com/fwlink/?LinkID=108182” style=”text-decoration: none;”><img src=”http://go.microsoft.com/fwlink/?LinkId=108181” alt=”Get Microsoft Silverlight”

style=”border-style: none”/></a>

</object>

Listado 5. HolaMundoTest.html

No hay ninguna fecha oficial, pero se rumorea queposiblemente este verano (junio).

¿Cuándo sale la versión definitiva?

No, el propio plug-in (que en estos momentos pesaalrededor de los 4 megas) trae una versión reducidadel framework, con lo que no es requisito tener ins-talada la versión completa.

¿Necesita tener el .NET Framework instalado en cliente?

Para saber másURL Comentarios

http://silverlight.net Sitio oficial de Silverlight. Desde aquí podrádescargar todo el material necesario para desa-rrollar (plug-in, SDK, tutoriales, etc.).

http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx Introducción a Silverlight Beta 1, compues-to de un tutorial que se divide en 8 partes, conel sello inconfundible de Scott Guthrie. Ide-al para iniciarse en esta tecnología.

http://www.silverlight.net/quickstarts/managed.aspx Conjunto completo de tutoriales; la seriesobre comunicación es muy interesante. Losejemplos están disponibles para descargar.

http://silverlight.net/blogs/jesseliberty Blog del “evangelista mayor” de Silverlight.Muy buen material, útil y ameno.

Si quiere explorar más a fondo los detalles de los controles y componentes que incorpora Silverlight, puede tomarcomo base un buen libro de WPF; al fin y al cabo, Silverlight es un subconjunto de éste. Una lectura muy reco-mendable y que también le puede servir como referencia técnica es el Cuaderno Técnico Nº7 de dotNetManía,“Windows Presentation Foundation”, de los autores Miguel Katrib, Mario del Valle, Iskander Sierra y YamilHernández. Próximamente editaremos un libro sobre Silverlight 2.0 de Marino Posadas (¡estén atentos!).

ClientBin/HolaMundo.xap

Page 35: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 36: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Otro mes ha pasado... y aquí estamos nuevamen-te, viendo qué podemos generalizar.

Es el turno hoy de algunos componentes quenos ayudarán a medir qué está pasando con nues-tra aplicación. Aun cuando esto no parezca muyútil, les puedo asegurar que, cuando se trabaja eva-luando qué está pasando con una aplicación, real-mente se echan en falta estas cosas.

De contadores

Establecer contadores en los componentes escomo cuando se va al médico. Te toma el pulso,te mide la presión, te hace un análisis para vercuántos glóbulos tienes o cómo está el azúcar enla sangre.

Llamativamente, esta comparación me vienecomo anillo al dedo, porque se parece mucho a loque podemos hacer. Algunos de estos resultados,como los de los glóbulos, se expresan en cantida-des: cuántos rojos tienes, por ejemplo. Otros sonproporcionales: cuántos gramos de azúcar por litrotienes. Y en muchos casos se miden variaciones:cuánto peso has aumentado desde la última vezque medimos.

Esas son, precisamente, las formas que los con-tadores pueden expresarse. Y cada una de ellas ser-virá para cosas distintas.

Funcionalidad que podemos encapsularObviamente, existen elementos en el propio .NETFramework para trabajar con contadores. Específi-camente, el tipo System.Diagnostics.Performance-Counter. Lo que vamos a intentar es encapsularlo demodo que resulte algo más sencillo implementarluego contadores en otros componentes (como yahicimos con los manejadores de excepciones).

Una de las primeras cosas a decir en estos casoses: implementemos IDisposable. Así .NET Fra-mework tendrá absoluta certeza acerca de quéhacer con estos objetos.

Public MustInherit Class PerformanceCounterBase_

Implements IDisposable

E inmediatamente, tengamos como privadoun objeto contador del propio .NET Framework.

Protected mPerfCounter As _System.Diagnostics.PerformanceCounter

Definamos las acciones posibles paranuestros contadores

Ya dijimos qué tipos de conteos podríamos llevar,comparados con la medicina. Simplemente, vamosa por ello:

Componentes de uso generalDe contadores y trazas

plataforma.net

Siguiendo con la serie de componentes de múltiples usos, veamos cómocrear nuestros propios contadores y definir trazas, lo cual nos permi-tirá identificar aquellas situaciones que puedan provocar dolores decabeza cuando toda la aplicación esté en uso.

Estas clases estarán en un espacio denombres nuevo, en mi caso llamadoSolid.Diagnostics[ ]

NOTA

Daniel Seara

Daniel Seara es mentorde Solid Quality Mentors

y director del área dedesarrollo .NET. Es MVP

desde 2003 y ponentehabitual de INETA y

Microsoft.

Page 37: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

37

dnm.plataforma.net<<

Aumentar un contador

Disminuir un contador

Cambiar un valor promedio

También deberemos ocuparnos de la interfazIDisposable:

Además, definiremos algunas propiedades que lasclases que heredan deberán implementar (estimo quelos nombres son explicación suficiente ☺).

La complicación de la creación de contadores

El problema que nos encontramos es que los conta-dores de rendimiento deberían instalarse antes de serutilizados. Lo cual significa que deberíamos crear ins-taladores para nuestros componentes, cosa que podríaestar bien, pero a veces resultar innecesario.

Sin embargo, podríamos partir de la base (que notiene por qué ser del todo cierta, pero éstos son nues-tros componentes, los diseñamos a nuestro estilo) deque cada categoría de contadores se corresponde conun proyecto/ensamblado. Esto nos permitiría agru-par los contadores por ensamblado y manipularlosadecuadamente, incluyendo su creación en caso de noexistir.

El problema es que los contadores pueden crear-se por código… siempre que se creen junto con lacategoría de los mismos.

Entonces, lo que deberíamos hacer es seguir unplanteamiento como el que muestra la figura 1.

Cuando se quiera utilizar un contador, obvia-mente se creará una instancia. Es entonces el cons-tructor el mejor lugar para decidir si todas las condi-ciones están dadas, y establecerlas de no ser así.

Como se puede ver, algunos métodos tie-nen el mismo nombre y distinta firma (unorecibe un argumento, el otro no). Digamosque, a fuerza de ser estrictos, aquí está fal-tando el Overloads; pero vamos, que VisualBasic es lo suficientemente inteligente paradarse cuenta.

[ ]NOTA

Sub DecrementCount()mPerfCounter.Decrement()

End SubSub DecrementCount(ByVal value As Long)

For i As Long = 1 To valuemPerfCounter.Decrement()

NextEnd Sub

Sub ChangeAvg(ByVal newValue As Long)Dim actual As Long = mPerfCounter.RawValuemPerfCounter.RawValue = _CLng(If(actual=0, newValue, (newValue+actual)/2))

End Sub

#Region “MustOverrides”

MustOverride ReadOnly Property _

Name() As String

MustOverride ReadOnly Property _

Type() As PerformanceCounterType

MustOverride ReadOnly Property _

Description() As String

#End Region

#Region “ IDisposable Support “Private disposedValue As Boolean = False ‘ To detect redundant calls‘ IDisposableProtected Overridable Sub Dispose(ByVal disposing As Boolean)

If Not Me.disposedValue ThenIf disposing Then

If mPerfCounter IsNot Nothing ThenmPerfCounter.Dispose()

End IfEnd If

End IfMe.disposedValue = True

End Sub

Sub IncrementCount()mPerfCounter.Increment()

End SubSub IncrementCount(ByVal value As Long)

mPerfCounter.IncrementBy(value)End Sub

Page 38: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Claro que, siendo éste el caso, y nece-sitando crear instancias para poder obte-ner sus definiciones, estamos haciendoun pequeño truco: utilizar una señalcompartida (la variable inCreation), parasaber cuándo ya estamos dentro de esteproceso. Si estamos preparando el terre-no (creando la categoría y los contado-res), entonces esto nos permite crear ins-tancias sin caer en un bucle infinito.

Luego procedemos a evaluar si lacategoría no existe, en cuyo caso defi-nimos un creador de contadores (Coun-terCreationDataCollection):

Luego, investigaremos qué tipos(clases) existen que hereden de esta cla-se base; ellos serán los contadores deese ensamblado.

Para ello, primero obtenemos quiénes el ensamblado del que se está creandouna instancia, utilizando System.Reflec-tion.Assembly.GetCallingAssembly. Esteobjeto expone los tipos definidos comopúblicos, a través del método GetExpor-tedTypes. Y, ya que estamos, por qué nousar un poco de LINQ para obtener losque nos interesan (así mi amigo Octaviose pone contento ☺).

Los contadores que encontramosen dicho bucle los vamos agregando alcreador de contadores:

Shared inCreation As Boolean = False

Protected Sub New( _

ByVal CategoryName As String, _

ByVal CounterName As String, _

ByVal instanceName As String)

Dim cat As _

PerformanceCounterCategory

‘Esto permite reentrar, para

‘crear cada instancia en

‘el momento de la definición

If inCreation Then Exit Sub

For Each t As Type In _(From tp As Type In _

System.Reflection.Assembly._GetCallingAssembly._GetExportedTypes _

Where tp.IsSubclassOf(_GetType(PerformanceCounterBase)))

With CType(System.Reflection.Assembly._GetCallingAssembly.CreateInstance(_

t.FullName),_PerformanceCounterBase)

Creator.Add(New _CounterCreationData(.Name, _

.Description, _

.Type))End With

Next

Create:‘Si no existe la categoría If Not PerformanceCounterCategory.Exists(CategoryName) Then

‘Para permitir reentrar sin volver a crear la categoríainCreation = True‘Creador de contadoresDim Creator As New CounterCreationDataCollection()

Figura 1 Lógica de construcción de contadores

Una de las cosas quesiempre quedan para

después en una aplicación esimplementar mecanismos demedición. Pues bien, esto no

debería ser así. Por ello, este artículo pretende sentar las bases de una

implementaciónsimple y reutilizable

Page 39: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

39

dnm.plataforma.net<<

Una vez se han agregado todos loscontadores del ensamblado, creamostodo el conjunto:

Ahora bien, si la categoría existie-se, pero no el contador, casi con todacerteza se ha cambiado de versión delensamblado que las define (se hanagregado nuevos contadores). En estecaso, no es sólo cuestión de agregar elcontador… hay que hacer todo denuevo. Entonces, eliminamos la cate-goría, y retomamos la creación com-pleta.

Finalmente, estando seguros de quetenemos todas las condiciones quenecesitamos, procedemos a crear elcontador interno de esta clase.

Usando el contador base

Como estoy seguro que tengo lectoresfieles, todos sabréis del componente deacceso a datos de números anteriores ☺.

En él mencioné la posibilidad detener métodos que llamen a auxiliaresde diagnóstico, para contar rendimien-to, hacer trazas, etc. (dotNetManía nº46, página 33). Pues bien, creemos doscontadores en dicho componente:

Contador de cantidad de consultas:

Promedio de tiempo de ejecuciónentre consultas:

Y una pequeña prueba

En el artículo del número anteriorantes mencionado, teníamos un for-mulario para probar el componente deacceso a datos. Voy a modificar el códi-go del botón que hacía la llamada, paraque la repita varias veces. De esa formapodremos ver más fácilmente el conta-dor de consultas en acción:

cat=PerformanceCounterCategory.Create(_CategoryName, _String.Format( _

“Performance counters for {0} Assembly”,_

System.Reflection.Assembly._GetCallingAssembly.GetName.Name),_

PerformanceCounterCategoryType._MultiInstance, _

Creator)

inCreation = False

Imports Solid.Diagnostics

Public Class PerfCounterQueries

Inherits PerformanceCounterBase

Sub New(ByVal instanceName As String)

MyBase.New(“Solid Data”, _

“Queries Qty”, _

instanceName)

End Sub

Sub New()

MyClass.New(“”)

End Sub

Public Overrides ReadOnly Property_

Name() As String

Get

Return “Queries Qty”

End Get

End Property

Public Overrides ReadOnly Property_

Type() As System.Diagnostics._

PerformanceCounterType

Get

Return PerformanceCounterType._

NumberOfItems32

End Get

End Property

Public Overrides ReadOnly Property_

Description() As String

Get

Return _

“Counts the amount of queries

executed by the instance”

End Get

End Property

End Class

Imports Solid.DiagnosticsPublic Class PerfCounterQueryTimeInherits PerformanceCounterBase

Sub New(ByVal instanceName As String)MyBase.New(“Solid Data”, _

“Query Time Avg”, _instanceName)

End Sub

Sub New()MyClass.New(“”)

End Sub

Public Overrides ReadOnly Property_Name() As String

GetReturn “Query Time Avg”

End GetEnd Property

Public Overrides ReadOnly Property_Type() As_

System.Diagnostics._PerformanceCounterType

GetReturn PerformanceCounterType._

RateOfCountsPerSecond32End Get

End Property

Public Overrides ReadOnly Property_Description() As String

GetReturn “Average time for queries”

End GetEnd Property

End Class

ElseIf Not PerformanceCounterCategory._

CounterExists(CounterName,_CategoryName) Then

PerformanceCounterCategory._Delete(CategoryName)

GoTo Create ‘Crea todo el conjuntoEnd If

End If

mPerfCounter = New _PerformanceCounter( _

CategoryName, _ ‘CategoríaCounterName, _ ‘ContadorinstanceName, _ ‘InstanciaFalse) ‘solo lectura

End Sub

Private Sub tsbTodos_Click( _ByVal sender As System.Object, _ByVal e As System.EventArgs) _Handles tsbTodos.Click

For i As Integer = 0 To 10LlenarConTodos()

Next

End Sub

Page 40: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

40

dnm.plataforma.net<<

Por otra parte, voy a poner unaespera en el procedimiento almacena-do, para que demore más tiempo.

Accediendo al monitor de rendi-miento (Performance Monitor), puedoagregar mis contadores luego de haberejecutado al menos una consulta paraque éstos se creen (figura 2).

Seleccionemos todos los contado-res (“All Counters”) y todas las instan-cias (“All Instances”).

Si ejecutamos repetidamente la con-sulta, podremos ver la variación en el

contador “Queries Qty”, mientras queel “Query Time” se mantiene constan-te la mayor parte del tiempo, ya que lademora en el procedimiento es siem-pre la misma.

En la figura 3 se nota una elevacióndel contador de tiempo casi al final delgráfico. Allí fue donde se hizo clic en elbotón de llamada de la consulta por pri-mera vez, que conlleva mayor tiempode acceso.

De trazasYa vamos llegando al final de este artí-culo (el espacio es tan tirano como eltiempo), pero es más fácil resolver eltema de las trazas. En ciertos senti-dos se parece al manejo de excepcio-nes. Una clase base, que expone méto-dos de persistencia y propiedades devalor, y una clase de configuraciónque determine donde se almacena latraza.

Para las trazas, es altamente reco-mendable que dejemos todo definidocomo para almacenar en base de datos.Y que separemos en archivos físicos porfecha en el caso en que almacenemosen disco.

La clase base de las trazas expondrátantas propiedades como se quieran

identificar (esto dependerá de lo que sedesee informar).

También habrá que considerar quelas clases que heredan de ésta podrándefinir propiedades que expandan lafuncionalidad de la clase base… y estarpreparadas para persistirlas.

Entonces, no importa dónde ni conqué formato se persista, en todos loscasos todas las propiedades indicadasdeberían almacenarse.

Para este ejemplillo (que no tengolugar para más), asumamos que alma-cenamos en algún medio que admiteXML (no es que sea fanático, pero mesirve para el ejemplo).

Podría ser entonces algo así:

Si, de acuerdo. Pidamos al Guille queexplique esto algo mejor desde su isla.

Nos vemos en la próxima.

ALTER PROCEDURE[dbo].[Shippers_TraerTodos]

ASWAITFOR DELAY ‘00:00:05’SELECT ShipperID, CompanyName, PhoneFROM ShippersORDER BY CompanyName

Sub Persist()Dim x As XElement = <Entry></Entry>For Each p As Reflection.PropertyInfo_

In Me.GetType.GetPropertiesx.Add(<<%= p.Name %>>

<%= CallByName(Me, p.Name,_CallType.Get) %>

</>)Next‘se guarda el valor

End Sub

Figura 2 Selección de contadores

El constructor de cada unode estos contadores utiliza elnombre de la conexión comonombre de la instancia. Poreso, en la figura 2, en la listade instancias aparece dichonombre: nw.

[ ]NOTA

Figura 3. Medición de los contadores

<%=<%=

%>

%>

Page 41: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 42: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Isla VB

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de ddotNet-Manía, mentor de Solid

Quality Mentors, oradorde Ineta Latam, y autor

de los libros “ManualImprescindible de Visual

Basic .NET”, “VisualBasic 2005” y "Noveda-des de Visual Basic 9.0".

http://www.elguille.info.

No, no es que a Microsoft le haya dado por crear una nueva versión de VisualBasic que se solidarice con la humanidad. Pero el que escribe quiere que loslectores de esta “Isla VB” sí se solidaricen, y esa solidaridad solo la puedendemostrar actuando. ¡Espero que actúen!

Guillermo «Guille» Som

Visual Basic solidarioViejas costumbres, nuevas formas

Con el permiso de los lectores, voy a dedicar unas líneas de esta "isla" acomentar el caso de un niño de Almería llamado Juanma, que a primeros demarzo cumplió cuatro años y que padece una enfermedad conocida como Sín-drome de Alexander, que es una variante de la leucodistrofia.

La primera vez que leí sobre el caso de Juanma fue en un grupo de noticias privado. La primera impresiónque me llevé fue la que supongo que muchos se llevarían, sobre todo los que ya llevamos deambulando porInternet algunos años y hemos tenido ocasión de ver alguna que otra llamada a la solidaridad. Pero mi amigaEva (ex-MVP de Access) insistía en que la historia era cierta. Como soy incrédulo por naturaleza, hice algu-nas indagaciones, llamé por teléfono, busqué en Internet, incluso estuve en una oficina de Cajamar para infor-marme sobre la cuenta que habían abierto para recibir las donaciones.

El caso es que existe un centro en los Estados Unidos que está investigando una cura para esta enferme-dad. Parten de medicamentos ya aprobados por la FDA (han superado todas las pruebas para ser administra-dos a humanos) y actualmente tienen 10 medicamentos prometedores contra los daños que el síndrome deAlexander produce. Continuar con la investigación de cada uno de estos medicamentos ronda la cantidad de250.000 dólares USA.

La familia de Juanma está moviendo cielo y tierra para conseguir esas cantidades, para que se pueda llegara tener un tratamiento que administrar al niño. Ni que decir tiene que no solo hay que desembolsar el costede los tratamientos (2.500.000 dólares USA), sino que también hay que incluir los gastos de desplazamiento yla estancia en EEUU de la familia que acompañe al niño. Por lo que yo sé, el primer viaje lo costeará la CruzRoja (tanto los gastos de desplazamiento como la estancia), y por la información que tengo, el pasado 25 demarzo hicieron un ingreso en la cuenta de la institución que está haciendo estos estudios sobre la enferme-dad de Alexander de 676.207, 50 dólares USA.

Algunos estamos haciendo ingresos en la cuenta de Juanma, además de recabar información para despejardudas, que son muchas las que nos plantean algunos de los que queremos involucrar en esta causa.

No quiero alargarme más, solo dejaros la dirección Web de Juanma y esperar que cada cual actúe comobuenamente pueda y quiera. Por mi parte, el importe que me corresponde de todos los artículos que escribapara dotNetManía se ingresará directamente en esa cuenta o se usará para costear los gastos de desplaza-miento y estancia de Juanma y su familia si tienen que viajar a los EE.UU.

La URL con los datos de Juanma, y un poco de la historia: http://www.ayudajuanma.es.

¡ Ayuda a Juanma a vivir!

Page 43: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

43

dnm.isla.vb<<

Viejas costumbres, nuevas formas

Todos los que alguna vez han usadoVisual Basic, pero el de antes, es decir,el Visual Basic que no es para .NET(aunque aquí hay que hacer un inciso, yaque en realidad “los” Visual Basic ante-riores a .NET no son solo el que los vie-jos programadores hemos usado, ya quehoy en día hay muchos, pero muchos,muchos programadores que siguen usan-do Visual Basic pre .NET, y no solo por-que siguen usando Visual Basic 6.0, sinoporque usan Visual Basic para Aplica-ciones -VBA-, particularmente conAccess o Excel), el –digamos– VisualBasic clásico (o Visual Basic new age quediría mi amigo Daniel Seara), seguroque han intentado usar las funciones alas que están acostumbrados, pero se hanencontrado que en la versión de VisualBasic para .NET algunas no están y otrashan cambiado e incluso se usan de for-ma muy distinta.

A estas alturas de la vida programá-tica de Visual Basic para .NET Frame-work, no es plan hacer comparacionesde qué función sustituye a cuál, entreotras cosas, porque si me pusiera a haceresas comparaciones estaría unos cuan-tos años escribiendo artículos para inten-tar cubrir solo algunas de ellas. En lugarde eso, lo que voy a hacer en este artí-culo, y en algunos que sigan, es comen-tar algunas de esas “cosillas” que nor-malmente necesitamos hacer, y solocuando sea estrictamente necesario,pondré la equivalencia con las versionesclásicas de Visual Basic.

Y debido a que ya tenemos otraforma de hacer algunas de esas cosas alas que estamos acostumbrados (inclu-so los que ya hemos olvidado cómo sehacía con VB6), también intentaréexplicar cómo podemos aprovechar-nos de esas nuevas formas de hacer lascosas. Por supuesto, para que esto seaposible, el lector debe utilizar la últi-

ma versión de Visual Basic, la versión9.0, sí, la que se incluye con Visual Stu-dio 2008. ¡Exacto!1

¿Por dónde empezar? ¿Convierto mi código?

Muchos desarrolladores de VisualBasic 6.0 (llamaré así a las versionesanteriores a .NET o a las actuales queno utilizan el framework como basepara trabajar) seguramente se encuen-tran perdidos cuando quieren afron-tar un proyecto de Visual Basic para.NET. Y la mayoría de ellos, casi contoda seguridad, prefieren convertir el

código de sus viejos proyectos usandoel asistente de conversión que todas lasversiones de Visual Basic ofrecen, yasea la incluida en Visual Studio o en laversión Express, y no está mal. Es unbuen punto para empezar a tener pro-blemas.

No es que me queje de esta herra-mienta, ya que hace medianamentebien su trabajo, el problema real es queno deberíamos convertir los proyec-tos. ¿Qué estás diciendo, Guille? ¿Mesugieres que lo escriba todo nueva-mente, desde cero? Es que son “nnn”líneas de código que quiero aprove-char (sustituir “nnn” por la cantidadde líneas del proyecto). ¿No puedoaprovecharlas?

Claro que se pueden aprovechar. Dehecho, eso es lo que deberíamos hacer.

El problema es que pensamos queesa es la mejor forma, y puede que enalgunos casos lo sea, pero dudo que enla mayoría de los proyectos reales seauna opción válida.

Por ejemplo, ¿tenemos acceso adatos? Si la respuesta es sí, debemos olvi-darnos del código anterior. Así de drásti-co. Si pretendemos ahorrarnos unas horasescribiendo el nuevo código, a la larga lasperderemos, y seguramente no nos fun-cionará el proyecto. O lo que es peor, pue-de que algunas veces nos funcione. Peropor experiencia puedo asegurar de queserán muy pocos los casos que ese códi-go convertido funcione.

Un problema añadido (indepen-dientemente de lo que queramos con-vertir) es que no siempre se utilizan losnuevos controles de .NET. Esto ya semejoró un poco en la versión 2005 deVisual Studio, pero sigue habiendoalgunos que no se utilizan, y no porqueno existan, sino porque seguramente lafuncionalidad de los nuevos es diferen-te al de los antiguos, como puede ser elcaso del control RichTextBox.

También es cierto que existen losPowerPacks de Visual Basic y ya pode-mos disponer de controles como Line,Shape e incluso el "famoso" Printer.

Pero volvamos a los controles de losque no existen equivalencias. Y parareflejarlo con un caso real, voy a con-tar “mi historia” con un proyecto deVisual Basic 6.0.

Dudo que en la mayoría de los proyectos reales utilizar el asistente de conversión sea

una opción válida

1 Esa que es la protagonista de mi nuevo libro electrónico Novedades de Visual Basic 9.0, que por cierto, el cupón de descuento que indiqué el mespasado sigue siendo válido hasta el 30 de este mes de abril. Por tanto, los lectores de dotNetManía pueden usarlo al comprar el libro en la Webde Solid Quality Press: http://www.solidq.com/ib/eBookDetail.aspx?Id=1. El cupón de descuento del 50% es: “dnm3103”. Y siguiendo con lapetición solidaria de ayuda a Juanma, si el lector compra el libro con ese cupón de descuento, que piense que no se ha ahorrado nada, y el resto(7,50€) le pediría que lo ingresara en la cuenta de Juanma. Gracias.

Page 44: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

44

Desde que instalé por última vez elsistema operativo de mi portátil (Win-dows Vista Ultimate en inglés, para másseñas), decidí no instalar el entorno dedesarrollo de Visual Basic 6.0, entreotras cosas porque ya no quería seguirusándolo. Bueno, en realidad lo quehice fue crear una máquina virtual conel sistema operativo Windows XP (sinningún Service Pack), en el que tengoinstalado el Visual Basic 6.0 con el Ser-vice Pack 6, además de Visual Studio.NET 2003. El no instalar los ServicePack de Windows XP es porque aúnsigo manteniendo alguna que otra apli-cación de gestión creada con el compi-lador de BASIC versión 7.1, pero paraMS-DOS, que no es un Basic “visual”,y el SP2 de XP me deja menos memo-ria extendida de la que necesito paratrabajar con el QBX.exe, y si no puedocargar el código, es complicado hacermodificaciones. A quien le extrañe quesiga manteniendo este tipo de aplica-ciones, comentarle que: cuando lascosas funcionan ¿para qué cambiar?

En mis aplicaciones de Visual Basic6.0 siempre he usado (o usaba) muchasllamadas a la API de Windows, lamayoría de las veces para hacer cosassimples, pero que me rendían mejor conmis clases que tenían las llamadas a laAPI que usando los controles incluidoscon el entorno de VB6; por ejemplo,todo lo relacionado a los diálogoscomunes, particularmente en lo refe-rente a abrir y guardar.

También me gusta dar soporte dearrastrar y soltar (drag & drop), y algu-nas otras cosas "habituales". El proble-ma es que esas cosas habituales en misaplicaciones son causa de muchos que-braderos de cabeza a la hora de con-vertir el código.

Desde hace años, suelo encapsularel código todo lo que puedo; si bienVisual Basic 6.0 no soporta la herencia,sí que tiene otros medios para facilitar-nos la programación orientada a obje-tos, bueno, no a objetos, pero sí lo másparecido que se puede, sin necesidad deheredar nada.

Y precisamente, tener objetos sepa-rados me facilita el trabajo de conver-sión, por ejemplo, como dije antes, todo

lo relacionado con los cuadros de diá-logos comunes lo tengo en una clase;por tanto, cuando hago la conversión,utilizo la versión de esa clase que ten-go para que funcione en .NET y sim-plemente sustituyo la que el asistenteha convertido.

Retomando el problema de los con-troles sin equivalencia (no es que notengan equivalencia, sino que el asis-tente no utiliza los que se incluyen en.NET), en uno de los proyectos medecía que no tenía licencia para usarloen modo de diseño (ver la figura 1).

Este problema ya era conocido pormuchos de los que habitualmente usá-bamos Visual Basic desde la versión 5,y sabíamos que existía un fichero que

solucionaba todos estos problemas:Vbctrls.reg, que si bien se distribuía conotros controles, en realidad te solucio-naba todos estos problemas (y actual-mente sigue siendo válido).

Pero independientemente de quetengamos ese fichero mágico y poda-mos convertir cualquier proyecto, laverdad es que no lo tendremos fácil.

Siguiendo con el proyecto quecomento (que finalmente decidí seguirusando en su versión de VB6), el asis-tente me dice que tengo 35 errores decompilación, 47 de errores de diseño y169 advertencias. Pero claro, esto es lo

que me dice el asistente. Si miro la lis-ta de errores de Visual Studio, tengo102 errores y 49 advertencias (estas can-tidades son porque el máximo de erro-res es de 151, no porque “solo” seanesos los errores). Y curiosamente dosde esas advertencias es indicándome queno se puede localizar el componenteMicrosoft.VisualBasic.PowerPacks. Sí,es que no instalo ninguno de los Power-Packs para Visual Basic, ya que eso meobligaría a seguir haciendo las cosascomo se hacían antes. En un momen-to vuelvo sobre este comentario; antessigamos viendo la lista de errores.

En realidad los errores son fácilesde solucionar, el problema es quemuchos de ellos son por “costumbres”

adquiridas en todo lo referente a lacompilación tardía (late binding) de lasversiones clásicas de Visual Basic. Elproblema es que algunas de las cosasque yo hacía “por mejor”, ahora en.NET no se consideran buenas prácti-cas. Bueno, en realidad es que en .NETno se permite que se hagan. Por ejem-plo, yo en algunas partes del código quequería reutilizar, en lugar de crear obje-tos de tipo Variant, definía ciertas varia-bles como Control, ya que iba a usarlaspara almacenar algún control, que bienpodía ser una etiqueta o una caja de tex-tos. Por ejemplo, era algo habitual

dnm.isla.vb<<

Figura 1. Error del asistente al no encontrar licencia de un control

Page 45: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

detectar cuál era el control activo usan-do algo como esto:

tText = System.Windows.Forms.Form.ActiveForm.ActiveControl

La variable tText la definía comoControl, ya que lo mismo podía ser unTextBox o un ComboBox.

Pero esto ahora no funciona, parti-cularmente si quiero acceder a alguna delas posibles propiedades que tiene esecontrol, por ejemplo, SelText para obte-ner el texto seleccionado. ¿Solución?Definir esa variable como Object en vezde Control; de esa forma Option Strict

Off (que es la forma predeterminada deusar todo el código convertido) me per-mite hacer lo que quiera... al menos entiempo de diseño/compilación, lo queocurra cuando se llegue a esa línea ya severá en tiempo de ejecución. Porquefallar, fallará, ya que SelText o SelLengtho SelStart ya no son propiedades de loscontroles de textos.

Otro fallo habitual es cuando asig-namos valores a las propiedades prede-terminadas de los controles. Eso no exis-te en .NET, por tanto, nada de eso fun-cionará. Sí, el asistente intenta solucio-narlo, pero solo cuando conoce el tipode control. Y puedo asegurar que el asis-tente muchas de las veces no sabe quécontrol es el que está manejando.

Para solucionar todas estas inconsis-tencias, debemos hacer la conversión altipo de datos correcto (o adecuado). Unavez que lo hagamos, veremos si se pue-de o no usar esta o aquella propiedad.Pero doy fe de que es una tarea muydesagradable y consumidora de tiempo(y que si no se acompaña con litros ylitros de tila, seguramente no llegaremosa finalizar nunca).

Supongamos que hemos tenidopaciencia, que hemos realizado todas lasconversiones, que a pesar de que no nosgusta, hemos usado Option Strict Off.Que a pesar de que tampoco nos guste,hemos dejado la referencia al ensambla-do Microsoft.VisualBasic.Compatibi-lity, porque este ensamblado y otros dela misma “familia” lo único que consi-guen es retrasarnos más nuestro paso almundo de .NET, además de que algu-

nas de las funciones incluidas en reali-dad no nos mejoran el código: desde mipunto de vista, hasta lo empeoran, y sino, baste con ver las funciones de mani-pulación del contenido de los controlesListBox o ComboBox; hay más, pero coneso es suficiente para ver cómo se pue-den complicar las cosas sencillas. En elsiguiente código tenemos la forma pro-puesta por el código “compatible” y elque se puede usar de forma “natural”:

Texto.Text = VB6.GetItemString(Lista, Lista.SelectedIndex)

Texto.Text = Lista.SelectedItem.ToString

Y como esto, muchas cosas que sepueden resolver con una llamada almétodo ToString (que todas las clases de.NET implementan), pero que en elespacio de nombres para la compatibi-lidad se esfuerzan en ignorar.

Como decía, si una vez que hemosquitado todas esas advertencias y erroresejecutamos el programa, casi con todaseguridad fallará, sobre todo si es una apli-cación con acceso a datos. Y digo “contoda seguridad”, porque esta aplicaciónen concreto no la he terminado de con-vertir. Era demasiado trabajo para des-pués no usarla por miedo a que falle.

Entonces ¿cuál es la solución? Lasque yo he utilizado son dos. Una esseguir usando la aplicación de VisualBasic 6.0. La pregunta lógica (o el repro-che) sería decirme que no aprovecharélas nuevas características que me ofrece.NET Framework. Y mi respuesta es: silo necesito, sí que aprovecharé lo queme ofrece .NET. ¿Cómo? Creando conVisual Basic .NET el código que quie-ro usar en mi aplicación de Visual Basic6.0. Después de esta afirmación puedenocurrir dos cosas. Una que el lector nome crea, y será porque no ha leído miartículo del número 24 de esta revistacuyo título es “Usar componentes .NETdesde aplicaciones COM”, y la otra esque el lector me crea, incluso aunque nohaya leído ese artículo.

La otra solución es crear la aplica-ción completamente en .NET (preferi-blemente desde cero) y si viene al caso,usar componentes COM en la aplica-

ción de .NET (lo que se explicó en elnúmero 23 de esta misma revista).

En la primera de estas dos solucio-nes (la de usar componentes de .NETdesde VB6), se necesita un trabajo extrao previo, ya que la aplicación de VB6debe estar "pensada" para usar compo-nentes o al menos debe estar lo sufi-cientemente granularizada para que esosea fácil de hacer, ya que lo habitual esque escribamos el código "todo en uno"y no lo dividamos en componentes. Porsuerte, yo casi no tengo ese problema,ya que siempre he intentado encapsularal máximo mis aplicaciones; no todas,debo reconocerlo, pero sí casi todas, almenos las que no eran simples pruebaso aplicaciones de andar por casa y ter-minarlas en un tiempo récord.

La segunda (usar componentes deVB6 en VB.NET) es más inusual, y laverdad es que solo la he aplicado en unaocasión (aparte de las pruebas que unohace para saber que todo esto funciona).Ese caso concreto era porque necesita-ba usar ficheros de datos en los que usa-ba tipos definidos por el usuario (Type)que tenían valores numéricos, y esa tareaen Visual Basic 6.0 es cosa de niños, peroen .NET, al no permitir estos tipos dedatos y esa forma de acceso, pues se com-plicaba más de la cuenta, incluso usan-do las nuevas clases que aparecieron enVisual Basic 2005 para acceder a losficheros usando longitudes de registrosde tamaño fijo. Los que hayan usado las

dotN

etM

anía

<<

45

dnm.isla.vb<<

Es posible crear con Visual Basic .NET el

código que quiero usar enmi aplicación de Visual Basic 6.0

Page 46: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

46

dnm.isla.vb<<

funciones CVI, CVS, MKI, MKS, etc., sabránde qué estoy hablando.

Olvidemos el pasadoSí, creo que es lo mejor, ya que esto

se va a convertir en una serie de dimesy diretes que será como el cuento denunca acabar, que si lo describiera alestilo de las conversaciones de JoséSaramago sería algo así: Quieres que tecuente el cuento de nunca acabar, Sí,No digo que sí, digo que si quieres quete cuente el cuento de nunca acabar.

La cuestión es ¿por qué olvidarnosde lo que ya sabemos? Pero esa no esla cuestión, de hecho, yo insisto en queno nos olvidemos de lo que ya sabemos;es decir, si ya sabemos algo de VisualBasic, aprendamos lo nuevo, que todoeso que sabemos ya nos sirve.

Pero si la cuestión fuera esta otra:¿por qué debo dejar de usar Visual Basic6.0? Ya no habría nada que responder,al menos en contra, porque es una cues-tión lícita y con fundamento, particu-larmente cuando sabemos que la vidade las aplicaciones de Visual Basic 6.0se garantizan al menos hasta el año2015 ó 2016, que es la vida de WindowsVista y de Windows Server 2008, yaque ambos sistemas operativos inclu-yen el motor en tiempo de ejecución(runtime) de Visual Basic 6.0 y otroscontroles y librerías (o bibliotecas) quese usan habitualmente con las aplica-ciones de Visual Basic 6.0, además deque, aunque no esté soportado, hasta elIDE (entorno de desarrollo) de VisualBasic 6.0 sigue funcionando en esos sis-temas operativos. Y si la versión deVisual Basic que usaremos es la cono-cida como VBA, esa vida es más larga,ya que ese lenguaje se incluye con Offi-ce, y si no me equivoco, la próxima ver-sión de Office seguirá incluyéndolo, portanto, se le seguirá dando soporte yseguirá habiendo programadores quelo utilizarán.

Pero si ésta es la verdadera cuestión,habría que plantearse otras cosas, par-ticularmente porque en esta revista solohablamos de .NET y en esta columnaen particular, el tema principal es Visual

Basic para .NET, sobre todo en la ver-sión que se incluye con Visual Studio2008.

PowerPacks y compatibilidadhacia atrás

Hace unos párrafos comenté que notengo instalado ninguno de los Power-Packs de Visual Basic. En realidad solohay uno, la versión 3.0, que incluye loque había en los anteriores. La verdades que si esos controles o componen-tes que se ofrecen hubieran estado pre-sentes en las primeras versiones deVisual Basic .NET, seguramente mehubiera acostumbrado a ellos, lo mis-mo que a la posibilidad que tenemosdesde Visual Basic 2005 de usar los for-mularios sin necesidad de crear instan-cias. Bueno, en realidad esto últimodudo que lo llegara a usar, salvo en casosmuy contados, porque en mis aplica-ciones "clásicas" intentaba evitarlo, yaque es una fuente de problemas quemuchas veces son difíciles de detectar,hasta que caes en la cuenta de que estáshaciendo las cosas mal.

Y es que la manida compatibilidadhacia atrás creo que es más perjudicialque beneficiosa, al menos para los quepretendemos tomarnos en serio la pro-gramación, sí, incluso con Visual Basic.

Y como resulta que entre unas cosasy otras, en este artículo ya me he pasa-do un poco, mejor lo dejamos aquí y enpróximos artículos hablaremos de esascosas serias que los programadores deVisual Basic debemos conocer, o almenos, el que escribe esto piensa quedebemos educarnos en una mejor for-ma de hacer las cosas, incluso con unlenguaje que siempre ha tenido tanmala fama, aunque esa mala fama esprecisamente por la razón de que estelenguaje sea tan fácil de usar; tanto, quecualquiera es capaz de hacer un pro-grama con Visual Basic, incluso los queno tienen mucha idea. Y esto es lo peorde todo, ya que con la intención demantener un número alto de desarro-lladores que usan este lenguaje, se pre-tende dejar que se sigan haciendo lascosas como no se deben hacer.

Aunque, también hay que decirlo,seguramente cuando aparezcan las nue-vas versiones de C# y de Visual Basic consoporte para la programación dinámica,muchas de las cosas que ahora "detesta-mos" tendremos que tragárnoslas, almenos si nuestra intención es estar en sin-tonía con los nuevos tiempos. Por supues-to, esto será así, si lo hacen como hastaahora tienen previsto, ya que, por ejem-plo, en C# se va a permitir la ejecucióntardía (o enlace tardío, en inglés late bin-ding), eso que Visual Basic nos permitehacer si desactivamos Option Strict, aun-que, por supuesto, al estilo de C#, es decir,incluyendo ese código dentro de un blo-que que seguramente estará indicado porla palabra clave dynamic.

Pero ese será tema de conversaciónde los próximos meses o más.

ConclusionesEn este artículo no he mostrado

mucho código, lo siento, pero queríadejar claros algunos conceptos y temasque a muchos les inquietan. También escierto que no de dado ninguna soluciónmágica a esas inquietudes, pero esperohaber dado las suficientes pistas para quecada uno decida lo que más le convienehacer, sobre todo aquellos programado-res que no se deciden a "soltar" su viejocódigo, principalmente por temor.

En este aspecto, decirle a todos esosque no quieren cambiar, que cambien;no que cambien su código que ya fun-ciona, porque seguramente será más rápi-do y hasta es posible que más eficienteque con Visual Basic para .NET. Si fun-ciona bien, ¿para qué cambiarlo?

Lo que también digo, y lo digo porexperiencia propia, es que si hay queafrontar un nuevo proyecto, lo mejor eshacerlo con los nuevos compiladores; setermina antes y salvo por la curva deaprendizaje, a la larga será más funcio-nal. Afortunadamente, existen revistascomo ésta que te explican esas nuevasformas de afrontar las nuevas tecnologíasy también hay muchísima documenta-ción que facilita el cambio.

Nos vemos en el siguiente número,en el que sí habrá código.

Page 47: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 48: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

La caché es una técnica comúnmente utilizada paraacelerar el acceso a datos, y se basa en la presun-ción de que podemos devolver “datos existentes”,en lugar de obtener los más recientes del sistemade almacenamiento. El punto aquí es: ¿con quéfrecuencia cambian esos datos? El uso de una cachéacelera enormemente las respuestas, pero no haygarantía de que se nos devuelvan datos actualiza-dos. La pregunta es entonces: ¿cuán crítico resul-ta para la aplicación, o incluso para una páginadada, recibir datos actualizados?

Normalmente, los datos en caché son mudosy ciegos. Están donde los almacenamos y se que-dan hasta que los borramos. No son dinámicos enabsoluto y no se actualizan solos. En ASP.NET,sin embargo, se suministran algunos mecanismospara detectar cambios en el estado de la aplica-ción que pudieran afectar a los datos en caché. Elobjeto Cache de ASP.NET soporta el concepto dedependencia. Está basado en la suposición de queel sistema operativo informa con prontitud al obje-to Cache de qué parte de su contenido está desac-

tualizado. ASP.NET soporta dependencias basa-da en ficheros o en marcas temporales. El meca-nismo basado en ficheros es interesante, porqueasocia los datos en caché con un timestamp de unfichero del servidor. Resulta particularmente útilcuando los datos en caché son precisamente loscontenidos en el fichero. El sistema se encarga deavisar cuándo cambia el contenido. En esemomento, el gestor de Cache destruye los datosviejos, y la próxima vez que la aplicación los soli-cite se realizará una consulta al sistema de alma-cenamiento para actualizarlos.

En ASP.NET 2.0, Microsoft añadió depen-dencia de base de datos mediante la clase SqlCa-cheDependency, que es el objeto de esta pregunta.Una vez establecida una dependencia entre la tablade la base de datos y una entrada de la caché, loscontenidos de ésta serán invalidados siempre quecambien aquellos de la tabla que representa. Estemecanismo es casi automático y sencillo para eldesarrollador. Pero, como puedes sospechar, losproblemas aparecen en los detalles.

Asegurarse de que las técnicas son compatibles con la aplicación

Dino Esposito

Dino Espositoes mentor asociado

de Solid QualityMentors. Es ponentehabitual en eventos

a nivel mundial. Visitesu blog en:

http://weblogs.asp.net/despos.

([email protected])

Estoy considerando incluir SQL Cache Dependency en un sitio Web en el que trabajo actual-mente. Mirando la documentación, parece fácil de usar y libre de problemas. Y, de hecho, en mispruebas funciona bien. Pero me pregunto si estoy pasando algo por alto, y si esta característicaescala bien cuando crece el volumen de datos.

todonet@qa

En términos generales, las técnicas pueden ser muy poderosas, pero podríanno funcionar en un contexto específico. Por esta razón, antes de emplearuna característica en una aplicación, deberíamos asegurarnos de que fun-ciona para nuestro caso. Parece algo muy repetido, pero no pueden imagi-narse cuántos proyectos fallan por esta causa. Este mes revisaremos un parde pros y contras relacionados con tecnologías ASP.NET.

tod

otN

et.q

a@

dot

netm

ania.c

om

Page 49: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Si los datos de la tabla cambian muy fre-cuentemente, la caché se actualiza frecuen-temente, y esto acaba por añadir presión a lagestión de la base de datos. Estrechamenterelacionado con la frecuencia, nos encontra-mos con el tamaño de los datos en caché.Cuantos más datos en la caché, mayor impac-to va a tener su actualización sobre la base dedatos cuando algo cambie.

Se trata, pues, de una posibilidad intere-sante, pero tampoco es una solución mágicapara acelerar las aplicaciones. Podemos fiar-nos de esa tecnología, pero tenemos que bus-car un balance entre la cantidad de datos enla caché y su frecuencia de actualización.Tenemos que conocer nuestros datos. Si tie-nen demasiados registros, hay que estar preparado pararecargarlos al más mínimo cambio. Y, si la probabilidadde esos cambios es alta, pueden surgir problemas. Por otrolado, con muy pocos registros tendremos poca sobrecar-ga. ¿Cómo modular el tamaño de la caché de dependen-cia?

En SQL Server 2005, una caché de dependencia sedefine sobre una tabla como el resultado de un comandode consulta, tal y como vemos en el siguiente código:

SqlCacheDependency dep = new SqlCacheDependency(cmd);

Cache.Insert("MyData", dataSet, dep);

Aquí cmd representa un objeto SQLCommand cuyos resul-tados van a ir a parar a la caché. Trabajando con el códigodel objeto Command, se puede modificar el tamaño del con-junto de resultados. Cuando se usa la caché, puede defi-nirse claramente un tiempo de expiración máximo y com-binar dependencia de tiempo con dependencia de base dedatos. En SQL Server 2005 no se precisa ningún trabajode configuración sobre la base de datos monitorizada. Sitodavía estamos trabajando con SQL Server 2000, nece-sitamos crear triggers y tablas específicas para soportar estacaracterística. No obstante, la API de programación per-manece casi inalterada.

dotN

etM

anía

<<

49

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

Tengo una página ASP.NET AJAX que consulta al servidor cada pocos segundos para actualizaralgunos contenidos. Recientemente me comunicaron que algunos usuarios finales se olvidan decerrar el navegador. Desafortunadamente, mi página no es lo suficientemente “lista” como paradetectar cuándo hay un usuario activo o no. De forma que establecí un temporizador de clienteque detiene la tarea después de dos horas. El problema es que la tarea consiste simplemente enrefrescar un panel usando un control ASP.NET Timer. Y no sé cómo hacer esto programáticamen-te desde el cliente.

El control Timer introducido con ASP.NET AJAX Exten-sions y mantenido en ASP.NET 3.5 es un envoltorio paraun objeto timer de cliente. En particular, el control Timerinyecta código de script que genera un Timer de Javascripty realiza un postback cuando expira el temporizador. Asímismo, el control Timer –un caso único en los controlesASP.NET– expone un modelo de objetos de cliente paraejecutar la mayoría de las operaciones que pueden reali-zarse sobre él en el servidor. Pero, como has podido expe-rimentar tú mismo, no siempre funciona como debería.

El control Timer dispone de una propiedad booleanallamada Enabled. Cuando es verdadera, el timer es reac-tivado en el cliente; si es falsa, el timer es destruido alfinal de proceso subsiguiente de postback. ¿Se puedeparar desde el cliente un timer de este tipo? Lo prime-

ro es encontrar una referencia a él. Así es como pode-mos proceder:

var clock = $find("<%= Timer1.ClientID%>");

Se puede utilizar el ID del control si no estamos utili-zando páginas maestras. La función $find es un alias defi-nido en la librería cliente de AJAX para localizar cualquierinstancia de una clase definida en la librería. En este pun-to, podríamos asumir que un código como el siguientesería suficiente para detener el timer:

clock.set_enabled(false);

No obstante, el método set_enabled únicamenteasigna el valor a la variable, pero no detiene el reloj. El

Tenemos que buscar un balance entrela cantidad de datos en la caché y su

frecuencia de actualización

Page 50: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Una petición dirigida a un servicio WCF esuna petición a una URL con la extensión .svc.La petición es capturada por IIS y manejadaa través de ASP.NET. Se realiza una autenti-cación y se pasa a la pila de WCF para su pro-cesamiento. La petición nunca vuelve a lacadena de proceso ASP.NET. El servicioWCF es alojado por IIS y funciona en cola-boración con ASP.NET, pero de forma total-mente separada. Esto quiere decir que ningúnservicio WCF puede acceder a HttpContexto a ASP.NET de forma intrínseca. No hayfichero o autorización URL que se pueda con-figurar en un recurso .svc. No es posible lasuplantación (impersonation). Para que estopueda suceder, hay que modificar el atributode compatibilidad en la clase de servicio WCF:

[AspNetCompatibilityRequirements(RequirementsMode =

AspNetCompatibilityRequirementsMode.Allowed)]public class TimeService : ITimeService {

//...}

¿Cuándo necesitas realmente compatibilidad conASP.NET? Tanto WCF como ASP.NET sirven peti-ciones entrantes, pero WCF lo hace de una forma muchomás desligada e independiente del transporte y el alo-jamiento. Un servicio WCF puede ser utilizado en múl-tiples sitios e incluso utilizar diferentes asociaciones (bin-dings) y sus hosts no tienen que ser compatibles conASP.NET. Al mismo tiempo, un servicio WCF que sediseña únicamente para su utilización en aplicacionesASP.NET se integra mejor con ASP.NET.

Hay que notar que esa integración se produce en dosniveles: aplicación y servicio. Se necesita la siguiente

sección en el fichero Web.config para habilitar la com-patibilidad con todos los servicios bajo control del fiche-ro de configuración:

<system.serviceModel><serviceHostingEnvironment aspNetCompatibilityE-

nabled="true" /></system.serviceModel>

A continuación, cada servicio puede declarar cómodebe comportarse respecto a la compatibilidad utili-zando el atributo AspNetCompatibilityRequirements. Losvalores posibles son: NotAllowed (predeterminado),Required y Allowed. Si se elimina el atributo, el serviciono puede funcionar en modo de compatibilidad. Comolos valores en el fichero Web.config habilitan la compa-tibilidad para todos los servicios de la aplicación, obte-nemos una excepción. Puedes deshabilitar la compati-bilidad a nivel de aplicación, o hacerla requerida o per-mitida para cada uno de los servicios.

dotN

etM

anía

<<

50

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

Estoy teniendo problemas con un sencillo servicio WCF que quiero exponer a clientes AJAX. Lo creéutilizando el asistente de Visual Studio 2008 y no cambié nada significativo de la configuración. Me dicuenta de que en el código producido se añade un atributo AspNetCompatibilityRequirements. Siquito el atributo, el servicio no funciona, pero en la documentación pone que el atributo es opcional.Seguramente me falta algo, pero ¿qué?

Traducido al castellano por Marino Posadas

WCF sirve peticiones de una formamucho más desligada e independiente

del transporte y el alojamiento

método dispose sí que lo haría, pero destruyendo elobjeto, que no podría ser reactivado más adelante. Eltruco está en llamar al método interno del Timer Javas-cript, de nombre _stopTimer.

clock._stopTimer();

El hecho de que el nombre de este método comien-za por subrayado indica que es un miembro privado, y,por tanto, no debería de llamársele desde fuera de la cla-se. Pero, por el momento, sí que funciona y es la únicamanera de realizar la tarea.

Page 51: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

51

dnm.laboratorio.net<<

En este mundo de hoy, en el que cada vez la com-petencia es mayor y se acortan más los plazos quemedian entre la concepción un sistema y el momen-to de su implantación, la palabra de orden es, nece-sariamente, productividad. Y ese ha sido siempreuno de los puntos fuertes de Crystal Reports, muyprobablemente la herramienta de creación y proce-samiento de informes más popular del planeta, gra-cias en buena medida al hecho de que viene siendoembebida de una forma u otra dentro de las dife-rentes versiones de Visual Studio y Visual Basic des-de hace más de una década. En esta nueva versión,ya preparada para Visual Studio 2008, CrystalReports integra dentro del entorno de desarrollo eldiseñador de informes, un conjunto de ensambla-dos que encapsulan el motor de procesamiento deinformes, herramientas personalizadas para la gene-ración de clases .NET y componentes para el desa-rrollo rápido de aplicaciones Windows y Web queincorporen informes Crystal. Todo eso, unido a lasbondades innatas del producto y de su arquitectura(que se muestra en la figura 1), hace posible opti-mizar al máximo el proceso de creación de informesy su integración en aplicaciones .NET de cualquiertipo.

Antes de hacer un repaso general del proceso decreación de un informe Crystal dentro de VisualStudio 2008 (aunque quienes se actualicen a la ver-sión completa de Crystal Reports 2008 tendrán tam-bién la posibilidad de lanzar el diseñador de mane-ra independiente) y su consumo desde una aplica-ción Windows Forms, quisiera destacar tres aspec-tos importantes que aparecen por primera vez conCrystal Reports 2008 y que podrían ayudar a tomaruna decisión sobre la adquisición de esta versión delproducto:

• A diferencia de versiones anteriores, ya no exis-ten diferentes ediciones (Standard, Professional,

Developer) del producto, sino que la única edi-ción existente (con un precio de salida muy com-petitivo) incluye todas las posibilidades que antesse reservaban únicamente a la edición superior.

• En versiones anteriores, el despliegue de aplica-ciones Web (pero no Windows) que utilizaran elmotor de Crystal Reports requería el pago deroyalties, aun cuando se tratara del servidor Webcorporativo de nuestra propia empresa. En la ver-sión actual se ha eliminado este requisito.

• Esta nueva versión incluye varias facilidades queantes presentaban limitaciones o solo estaban dis-ponibles a través de productos de terceros, comola posibilidad de creación y modificación diná-mica de informes, la internacionalización o elsoporte para códigos de barras.

La tabla 1 presenta en formato resumido todas lasnovedades incorporadas a Crystal Reports 2008.

Crystal Reports 2008

Laboratorio.netOctavio Hernández

Octavio Hernández esMentoring TeamLeader de Plain

Concepts, editortécnico de

dotNetManía y tutorde campusMVP.

Es MVP de C# desde2004, MCSD y MCT.

Este mes presentamos las nuevas características que ofrece la versión más recien-te de otra de mis herramientas habituales, en este caso una con la que llevo tra-bajando más de una década en roles tan diferentes como los de formador, con-sultor, proveedor de soporte técnico o usuario avanzado. Se trata de CrystalReports, sin duda alguna el software con mayor solera dentro de la categoría delos generadores de informes.

Nombre: Crystal ReportsVersión: 2008 (12, según la numeración

interna)Fabricante: Business Objects (SAP)Sitio Web: http://www.businessobjects.com/Categoría: Generadores de informesPrecio:

• Producto completo: 479 EUR + IVA

• Actualización: 299 EUR + IVA

• Visual Studio 2008 Professional ysuperiores incluyen Crystal Reports 2008Basic Edition, desde el cual es posibleactualizarse al producto completo.

Ficha técnica

Page 52: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

52

dnm.laboratorio.net<<

Tabla 1. Novedades en Visual Studio 2008

Figura 1. Arquitectura de Crystal Reports

CREACIÓN DE POTENTES DATA MASHUPS

Driver para obtener datos de servicios Web, con soporte de codificación RPC de mensajes SOAP, SSL y estándares WS- Security,entre otras facilidades. Integración con Xcelsius, Adobe Flex y Adobe Flash: integración sencilla de componentes diseñados en Flash y Flex.

AHORRO DE TIEMPO DE DISEÑO

Mejoras en el diseñador, como la búsqueda de fórmulas, duplicación de fórmulas y acumulados o completamiento automático denombres de campos. Internacionalización: permite adaptar los informes en tiempo de diseño y ejecución al idioma y convenios locales. Soporte nativo para códigos de barras: permite representar campos como códigos de barras fácilmente y sin codificación alguna. Huella de instalación reducida: los tamaños de las librerías a incorporar en las aplicaciones se han reducido de manera significativa.

MAYORES POSIBILIDADES VISUALES

Integración con Adobe Flash: los datos del informe pueden ser accedidos desde los ficheros Flash (SWF) para hacer posibles infor-mes espectaculares e interactivos.Potentes tablas cruzadas: múltiples nuevas características hacen posible la creación de tablas cruzadas mucho más potentes que lasde versiones anteriores. Paginación flexible: múltiples novedades relacionadas con la paginación hacen posible, entre otras facilidades, combinar en un mis-mo informe distintas orientaciones de folios, tamaños de páginas, etc.

NUEVAS POSIBILIDADES DE INTERACCIÓN

Integración con Xcelsius: hace posible el análisis dinámico de diferentes escenarios, lo que facilita la toma de decisiones. Integración con Adobe Flex: hace posible integrar flujos operacionales desarrollados en Flex dentro de informes. Visualización interactiva: los visores de informes para aplicaciones Windows y Web permiten la ordenación, filtrado y reformate-ado dinámicos, de modo que los usuarios puedan analizar la información. Panel de parámetros: el diseñador y los visores ofrecen un panel de parámetros en el que se puede modificar los valores de los mismos.

NUEVAS FACILIDADES DE DESPLIEGUE

Guardar informes en crystalreports.com: le permite gestionar y compartir informes de manera segura. Driver de salesforce.com integrado: permite acceder a los datos de esa popular sistema. Exportación mejorada a XML: ahora es posible embeber transformaciones XSLT dentro de los informes, para que se disparen alexportar a XML. SDK de modificación de informes: ahora está disponible para los que utilicen la API de Crystal Reports para .NET, sin necesidadde disponer de un servidor RAS.

Page 53: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

Creando una aplicación básicaPara aquellos que no estén familiarizados con el desa-rrollo de aplicaciones .NET que consuman informesCrystal, presentamos un pequeño tutorial basado en unaaplicación Windows Forms. Y para que éste sea de algúninterés también a quienes ya han utilizado alguna ver-sión anterior del producto, haremos uso de algunas delas nuevas facilidades que ofrece Crystal Reports 2008.

Utilizaremos, como es ya habitual, la base de datosFUTBOL2006 de mi libro “C# 3.0 y LINQ” [2]. El infor-

me a desarrollar permitirá listar toda la plantilla deun club cualquiera, cuyo valor se determinará en tiem-po de ejecución y por lo tanto será un parámetro delinforme. Puede descargar la base de datos y todo elcódigo del ejemplo del sitio Web de la revista. Tengaen cuenta que necesitará al menos la versión de eva-luación de Crystal Reports 2008 para ejecutar la apli-cación de ejemplo, puesto que he hecho uso de nue-vas características en el informe y utilizado los ensam-blados de la nueva versión.

Para comenzar, creamos una nueva aplicaciónWindows Forms (lenguaje C#) y sobre el nodo delproyecto, seleccionamos la opción “Agregar” | “Nue-vo elemento” | “Crystal Report”, dándole el nombrePlantillaClub.rpt. El diseño de informes, que no des-cribiremos aquí, puede acometerse dentro del entor-no integrado utilizando un asistente de múltiples pági-nas o partiendo desde cero. En cualquier caso, reco-mendamos el estudio del informe de ejemplo, puesincluye algunos elementos no triviales como gruposanidados, fórmulas y parámetros.

Los informes incorporados a un informe pasana formar parte de él en calidad de recurso embebi-do. Al mismo tiempo, se genera un fichero de C#(figura 2) que define un informe tipado: una cla-se heredera de la clase ReportClass de CrystalReports, que extiende y personaliza ésta última demodo similar a como un DataSet tipado extiende laclase DataSet.

En este punto, podemos empezar a hacer uso delos componentes que agrega Crystal Reports 2008 alCuadro de herramientas para aplicaciones Windows

Figura 3. El informe de ejemplo en ejecución

Figura 2. Se genera un fichero de código fuenteque define un informe tipado

Page 54: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Forms. En primer lugar, utilizaremos CrystalReport-Viewer, el componente que se utiliza para visualizar losinformes. Este componente visual se enlaza a una ins-tancia de documento (informe) a través de la propie-dad ReportSource, que ofrece un editor personalizadoque nos permite indicar que vamos a utilizar comoorigen del informe una instancia del componente Crys-talReportDocument asociada a una instancia de nuestraclase PlantillaClub.

El visor de informes ofrece toda una serie de pro-piedades para configurar su barra de herramientas.Los que conozcan versiones anteriores de este com-ponente encontrarán dos nuevas propiedades: Show-ParameterPanelButton y ToolPanelView, que permitenactivar el nuevo Panel de parámetros, que facilita engran medida la ejecución repetida de un informe condiferentes valores de sus parámetros. La aparienciafinal de la aplicación, en la que se puede ver este nue-vo panel, se presenta en la figura 3.

ConclusionesCrystal Reports 2008 es la nueva versión de uno delos líderes del mercado en el área de la generaciónde informes, y gracias a la integración completa conVisual Studio 2008 que ofrece, pone a disposiciónde quienes desarrollan software para la plataforma.NET todos los recursos necesarios para la creación,mantenimiento e integración en aplicaciones depotentes informes de una manera sencilla y alta-mente productiva.

ReferenciasSitio Web de Crystal Reports 2008: http://www.businessobjects.com/product/catalog/crystalreports.

Hernández, O. “C# 3.0 y LINQ”, Krasis Press, noviembre de 2007.

[1]

[2]

Actualidad

Telelogic Modeler. Entorno gratuitode modelado basado en UML 2.1La multinacional sueca Telelogic ha puesto a disposi -ción del público Telelogic Modeler, un entornogratuito de mode lado basado en UML 2.1 para el diseñoy la docu mentación de sistemas y software. Desarrolladapor uno de los autores de UML 2.0 y basada entecnologías utilizadas por el fabricante en productoscomerciales como Raphsody o Tau, esta herramientaofrece la posibilidad de capturar y documentar losdiseños de una manera clara y eficiente.

Entre las principales características de este producto,podemos destacar las siguientes:

• Entorno de diseño orientado a los modelos: losdiagramas forman un modelo unificado,permitiendo que Modeler oriente al usuario en eldesarrollo de aplicaciones completas y correctas.

• Modelado robusto: entre los diagramas UML 2.1soportados se incluyen los diagramas de actividad,clases, componentes, estructuras compuestas,despliegue, interacción, objetos, paquetes, máquinasde estado, secuencias y casos de uso.

• Características avanzadas: Modeler soportaelementos UML 2.1 complejos, como la herenciade máquinas de estado o los modelos de actividaddetallados.

• Documentación integrada: los diseños puedenser documentados y comunicados de formaautomática.

Para más información y descarga de la herramienta,visite http://www.telelogic.es/products/modeler/index.cfm.

La única edición de Crystal Reports2008 incluye todas las posibilidadesque antes se reservaban únicamente

a la edición superior

54

<<do

tNet

Man

íadnm.laboratorio.net<<

Page 55: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

Novedades de Visual Basic 9.0Guillermo “Guille” SomEditorial: Solid Quality PressPáginas: 206Publicado: marzo de 2008ISBN: 978-8493641702Idioma: castellano

En este excelente libro, que se distribuye en formato electrónico, nuestro redactor ycolumnista Guillermo “Guille” Som (para mí siempre “El Maestro”) nos presenta, conel estilo ameno y asequible al que nos tiene habituados, una minuciosidad absoluta y unagran profusión de ejemplos que hacen aún más fácil la comprensión del material, las nue-vas características incorporadas por Microsoft a Visual Basic 9.0, la versión del popularlenguaje implementada en .NET Framework 3.5 y Visual Studio 2008. En particular, alo largo de los últimos cuatro capítulos se describen con lujo de detalles las nuevas posi-bilidades relacionadas con LINQ; incluyendo, por supuesto, aquellas que solo están dis-ponibles en Visual Basic y que probablemente el lector que se haya acercado a esta tec-nología desde C# aún no conozca. Pensamos honestamente que este libro es todo lo quenecesitará cualquier programador de versiones anteriores del lenguaje (y en particular dela versión 8.0, materializada en Visual Studio 2005 y sobre la que “Guille” ha producidoabundante documentación, mucha de ella disponible públicamente en su sitio Web) paraponerse al día con respecto a las nuevas características que ofrece la más reciente versiónde Visual Basic. Absolutamente recomendado.

C# 3.0 CookbookJay Hilyard y Stephen TeilhetEditorial: O’ReillyPáginas: 886Publicado: enero de 2007ISBN: 978-0596516109Idioma: inglés

Este conocido “manual de recetas” de programación en C# es sistemáticamente unode los libros mejor valorados por los lectores en todos los foros sobre el lenguaje en losque participamos. De corte eminentemente práctico y orientado principalmente a pro-gramadores de nivel medio y medio-avanzado, incluye más de 250 soluciones a proble-mas de programación comunes (y no triviales) que suelen presentarse con frecuenciadurante el desarrollo de software para la plataforma .NET, cubriendo numerosos aspec-tos tanto del lenguaje como de la Librería de Clases Base. La edición más reciente inclu-ye múltiples referencias a las nuevas características incorporadas a C# 3.0, y en particu-lar un capítulo dedicado a LINQ; pero pensamos que, a pesar de ello, éste no es “el fuer-te” del libro, y si usted piensa en comprarlo (algo que sin duda alguna recomendamos),deberá hacerlo más pensando en su valor integral que en lo que le enseñará acerca deestas novedades.

biblioteca.net

nove

dad

es Essential Windows Communication Foundation

Steve Resnick, Richard Crane, Chris Bowen. Editorial: Addison-Wesley Professional. Pági-

nas: 608. ISBN: 978-0321440068. Fecha de publicación: febrero de 2008.

Understanding Windows CardSpace Vittorio Bertocci, Garrett Serack, Caleb Baker. Editorial: Addison-Wesley Professional.

Páginas: 384. ISBN: 978-0321496843. Fecha de publicación: enero de 2008.

TEXTO: OCTAVIO HERNÁNDEZ

Dto. 50% para suscriptoresUsando el cupón dnm3103, válido para estemes de abril en http://www.solidq.com/lib/eBookDetail.aspx?Id=1

Page 56: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

56

¿Alguna vez os habéis quedado con ganas de asistira algún evento de un grupo de usuarios? En este con-texto nace la idea de buscar algún medio para poderhacer llegar la labor de la comunidad al mayor núme-ro de usuarios posible, permitiendo complementarsu labor haciendo uso de Internet, potenciando laidea de un grupo virtual donde las barreras físicasya no sean un impedimento y haciendo uso de nue-vas tecnologías que nos permitan explotar otras posi-bilidades.

Es por ello que tomando como excusa la celebra-ción del día del Orgullo Friki, Toni Recio y JoséLuis Cubero deciden intentar crear un grupo deusuarios que intente complementar la amplia ofertade NUG en España haciendo uso de un mundo vir-tual como es SecondLife, donde Microsoft venía invir-tiendo mucho dinero y donde curiosamente la lógi-ca de dicho mundo está programada con .NET.

Pasados los días, esa idea me fue transmitida decasualidad mientras Toni y yo comentábamos los nue-vos hilos del foro de MSDN. Así pues, me sumé al

carro de Second Nug, colaborando para reunir a másgente y a concretar ideas y tecnologías.

En un principio íbamos a seguir la idea inicial deusar Second Life y vídeo en directo vía streaming, pararetransmitir eventos propios y para tratar que los gru-pos presenciales se animaran a compartir sus charlaspor ese medio. Hubo muchos contactos con gruposanglosajones dentro de Second Life. En esa fase delproceso, David Salgado de Microsoft nos ayudó amover el tema, pero las limitaciones técnicas del entor-no virtual que plantea Second Life no ayudaban a aca-bar de lanzar el proyecto. Second Nug no despega has-ta que en octubre de 2007 fuimos invitados al TrainThe Trainers de Microsoft. Compartiendo nuestrasideas con el resto de grupos, Alfonso Rodríguez deMSDN nos propuso un nuevo medio para llevar a cabonuestras ideas: la tecnología Live Meeting de Micro-soft, herramienta que a las pocas pruebas nos demostróque nos venía como anillo al dedo. Ya no había excu-sas, ¡Second Nug podía empezar a andar!

Concretamos un día (el primer martes de cadames) y un tema y convencimos a nuestro primerponente Marçal Serrate para que nos diera en febre-ro una más que amena charla sobre CSLA.NET, a laque asistieron una treintena de personas y a la quecualquiera todavía puede asistir, ya que nuestros even-

Second NugGrupo de usuarios de .NET Online

comunidad.net

Second Nug• Ubicación: online• Fecha de fundación: mayo de 2007• Fundador: Toni Recio y José Luis

Cubero• Miembros: 13• Página: http://www.secondnug.com• Email de contacto:

[email protected]

Page 57: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

El 27 de febrero se realizó la entrega oficial de premios del Desafío Sil-verlight, el concurso organizado por BcnDev, el grupo de usuarios deBarcelona, y patrocinado por Microsoft Ibérica, Avanade, IN2, Ana-ya, dotNetManía y otras empresa fabricantes de software (ver http://desa-fiosilverlight.bcndev.net ).

En esta competición, se eligieron las mejores aplicaciones deSilverlight en base a criterios de código, diseño, innovación e uti-lidad.

El total de premios superó los 20.000€, lo que es muy destacablepara una competición de tal índole, y como parte del primer premioteníamos un viaje al MIX 2008 (ver págs. 6-7).

Aunque hubo muchas participaciones excelentes, solo podía haberun ganador, que se llevó el viaje al MIX, viaje a Las Vegas, hotel y entra-da incluidos. Todo ello junto con el título de “Mejor desarrollador Sil-verlight de España”, que no es poco.

El ganador desarrolló la aplicación “Weather Viewer”, un originalmashup que accede a varios servicios de una forma original y con muybuena realización. Este galardón y premios correspondieron a Fran-cisco Gómez Martín.

Sobre los jueces, nos han honrado con su votación:

• Arturo Toledo, res-ponsable de producto deMicrosoft Expression,en la parte de diseño.

• María Vila, directora deinnovación de Barcelo-na Activa, en la parte deinnovación.

• Damir Tomicic, presi-dente de INETA Euro-pa, en la parte de código.

• Alfonso Rodríguez, director de MSDN España, en la parte deutilidad.

En cualquier caso, agradecer a los patrocinadores por su excelentesoporte y apoyo a esta iniciativa, especialmente a Microsoft, Avanade, IN2,Anaya Multimedia y dotNetManía. Sin ellos esta competición no habríasido posible. ¡Muchísimas gracias a todos!

El equipo de BcnDev

tos se graban y son accesibles para sudescarga desde la propia página deMicrosoft.

Nuestro grupo ha ido ampliándo-se con la integración de varias de laspersonas implicadas en la colabora-ción de diversas comunidades técni-cas de Microsoft como el Foro deMSDN y otros grupos de usuarios, yuna vez en marcha volvimos a la ideade colaborar para retransmitir even-tos presenciales, y aprovechamos queToni iba a LoNetCamp a dar unacharla sobre Windows PresentationFoundation para ayudarles y guiarlesen la retransmisión online del evento.En la actualidad, seguimos con nues-

tro empeño de animar y ayudar a otrosgrupos a que se animen a compartirsu labor con todos nosotros.

Mientras escribo estas líneas, enSecond Nug ya estamos preparandonuestro segundo evento (el de marzo),“Presentando informes: Reporting Ser-vices vs. Crystal Reports” con FranDíaz y Carmen Sánchez, del quepodréis disfrutar en diferido cuandoleáis estas líneas. Y la cosa no acaba aquí,ya que para el 1 de abril, Hadi Haririnos obsequiará con una charla sobreWCF a la que espero os animéis aacompañarnos.

Para obtener toda la informaciónsobre los eventos y todo lo relacionado

con Second Nug, podéis visitar el sitioWeb, que cuenta con un aspecto reno-vado y más funcional gracias en buenamedida a Carmen Hernández, queademás nos ayuda a crear los cartelesde los eventos.

Esperamos que nuestro espíritu decompartir los conocimientos más alláde las fronteras geográficas de los NUGactuales se vaya contagiando poco apoco y pronto podamos ver eventosque, como los nuestros, puedan ser dis-frutados desde cualquier lugar del mun-do en vivo o en diferido.

dnm.comunidad.net<<

Visual Basic .NET vs C# .NET: ¿Cual es mejor y por qué?

Martes 6 de mayo de 2008, 19:30h - 21:30h (GMT+1)

Ponentes: • Guillermo Som, MVP de Visual Basic• Marino Posadas, MVP de C#

Second Nug tiene el honor de presentar a dos ponentes deexcepción, Guillermo Som (el Guille) y Marino Posadas (el AveFénix), en la que será una gran batalla donde dos voces congran experiencia expondrán sus mejores bazas en un duelo sinigual: VB .NET vs C# .NET.

Sabremos por qué se decantaron por un lenguaje uotro y nos presentarán la evolución de éstos en las nuevasversiones del .NET Framework. Nos desvelarán secretosy trucos de sus defendidos y veremos si es cierto aquellode que lo que se puede hacer con uno, se puede realmentehacer con el otro.

Además, los asistentes podrán resolver sus dudaspreguntando a nuestros expertos y participar en el resultadofinal de la contienda.

El eterno dilema al descubierto. ¿Quién será el vencedor?Más información en: http://www.secondnug.com

Javier Conesa

Conclusión y entrega de premios del Desafío Silverlight

eventos.eventos.eventos.eventos.eventos.eventos

Page 58: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual

dotN

etM

anía

<<

58

desván¿Qué hay de nuevo, viejo?

Como sabe el lector habitual, en esta seccióncomentamos a menudo noticias científicas rela-cionadas con el tratamiento de la información,y –de hecho- nuestro conocimiento (siquierasuperficial) de algunas de esas iniciativas de I+D

de Microsoft nos hace reaccionar con asombro ante comentarios enel sentido de “¿qué es lo que Microsoft investiga realmente?”, por lafalta de información que denotan. Y es que, a veces, como reza el refrán,“no basta con serlo, sino que también hay que parecerlo”.

Justo con ese espíritu de dar a conocer los trabajos de investiga-ción de la compañía se ha celebrado en el campus de Redmond, EE.UU.TechFest 2008, donde los investigadores han sorprendido con inicia-tivas tan variopintas, que muchas de ellas no son directamente aplica-bles a la informática, pero tienen un innegable valor científico. Veahttp://research.microsoft.com/techfest con interesantes vídeos explicativosde algunas de las propuestas más relevantes, como Microsoft World-Wide Telescope, que lideró durante años el Premio Turing James Gray(desaparecido el año pasado y a quien tuvimos ocasión de entrevistarpara dotNetManía en el nº 12). Se trata de poner a disposición de losinvestigadores de todo el mundo terabytes de información recopiladapor todos los telescopios activos del globo, incluso haciendo disponi-ble una herramienta para su visualización, donde uno puede llegar aprogramar sus propios “tours” por el universo (vea el vídeo publicadoen http://gizmodo.com/361728/microsoft-worldwide-telescope-in-awesome-video-action-verdict-my-god-its-full-of-stars). Otros desarrollos sí son direc-tamente aplicables –y deseables–, como un dispositivo táctil que per-mite seleccionar los elementos a través de la parte posterior del apara-to (Lucid Touch), o los trabajos sobre orígenes de datos protegidos yconsultas con privacidad integrada, sobre los que trabajan los equiposde diseñadores de LINQ y que protegen la información de las tuplasde entrada y agregan nuevos niveles de privacidad al proceso de recu-peración y almacenamiento de la información.

¿Y qué sucede con el día a día? En el sitio antes citado podrán leer-se multitud de iniciativas de toda clase, pero me gustaría citar algunasque prometen mostrar sus primeros bits (en fase beta) muy pronto.Uno de ellas es Stirling, producto en beta privada, que consolidamuchos de los esfuerzos de la compañía en materia de seguridad, inclu-yendo ForeFront, de forma que se pueda tener gestión unificada delos sistemas de seguridad tanto en el servidor como en el cliente. Y esque la lucha por la seguridad no cesa, ni debe hacerlo. De ahí el anun-cio reciente de la compra de la empresa cuyo producto estrella era undetector de rootkits (Komoko). Y de ahí que se hable de todo un nue-vo sistema de gestión de correo administrado para las empresas quepermita cumplir con normativas y políticas de trabajo (EmployeeManaged Mailbox, EMM). También suena Albany, un nuevo pro-ducto asociado con Microsoft Office, pero más al estilo del antiguoMicrosoft Works, esto es, para usuarios domésticos principalmente,y que funcionaría –si es cierto el rumor– asociado a las nuevas plata-formas de publicidad y presencia que la compañía prepara ahora yveremos en muchos productos en el futuro cercano. Y eso, con Offi-ce Live Workspace actualmente en beta, y anuncios iniciales de lo quepromete la nueva versión “Office 14”, especialmente en innovacionesen las áreas de colaboración en línea y presencia de los productos enel servidor. ¿Innovación? Sí, gracias.

Marino Posadas

Top Ten software Easter Eggsconsiste en una recopilación delos más afamados “Huevos dePascua” (comportamientos noconocidos o sorpresivos) quepodemos encontrar en el softwa-re más popular: Internet Explo-rer, Firefox, Google Earth, Picasa, etc. Puede leerse enhttp://lifehacker.com/371083/top-10-software-easter-eggs.

Shut down Windows in an instant. Como dice su autor,Dennis O’Reilly, algunos programasno saben cómo decir adiós. Tras un pocode investigación, descubrió cómo hacerque eso no sea un problema, y los siste-

mas operativos se apaguen en un instante. Disponible enhttp://www.cnet.com/8301-13880_1-9900788-68.html?part=rss&subj=news&tag=2547-1_3-0-20).

Blog de Martin Maly. Se trata del creador demuchos de los avances relacionados con len-guajes dinámicos (IronRuby, IronPython, yel propio Dynamic Language Runtime -DLR). Precisamente ahora acaba de anun-ciar la disponibilidad de la Beta 1 del DLR:http://blogs.msdn.com/mmaly.

Blog de Chris Love. MVP en ASP.NET, igualmente expertoen SharePoint. Muchas entradas de interés relacionadascon ambas tecnologías, noticias, entrevistas y reflexionessobre el desarrollo del “Windows Client”: http://professio-nalaspnet.com.

TechSupport: un sitio de utilidades.Uno de los sitios especializa-dos en recopilar utilidades deinterés, ya sea para desarrolloo para sistemas. En la página recomendada se analizan las“46 Best-ever Freeware Utilities”, que aparte de ser muybuenas herramientas, son gratuitas. Accesible enhttp://www.techsupportalert.com/best_46_free_utilities.htm.

documentos en la red

utilidades del mes

blogs del mes

noticias.noticias.noticias

RunAsDate. Como su nombreindica, permite ejecutar unprograma “desde otra fecha”,como si el sistema operativo tuviese cambiada la fecha delsistema. Es gratuito y está disponible en http://www.free-warefiles.com/RunAsDate_program_32729.html.

Page 59: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual
Page 60: dotNetManíaBienvenido al número 47, de abril de 2008, de dotNetManía. Este mes entrevistamos, con Marino Posadas de maestro de ceremonias, a tres de las cabezas visibles de Visual