Está en la página 1de 107

Aplicaciones Web

INDICE

1.- ASP NET Asp Net ADO NET Clases Bsicas para gestin de Datos Acciones de Ida y Vuelta de Una WEB Directivas den ASP Tipos de Datos Web Form - controles Funciones Numricas, cadenas y Fechas 2.- Aplicaciones Web- form calculo matemticos Empleando el Datgrid1 Consultas con Hipervnculos 2.1 Consultas en cascada 2.2 Genrador de Propiedades de un datagrid 2.3 Actualizaciones en linea 2.4 Empleando Store Procedure 3.- Reportes 3.1 Crystal Report entorno para el diseo 3.2 Creacin de unos reportes simple con campos enlazados 3.3 Ejecucin de un reporte desde un formulario 3.4 Filtros en un reporte 4.- Web Service 4.1 Definicin 4.2 Web Method 4.3 Publicacin de los Web Service 4.4 Acceso a los servicios 4.5 Aplicacin con web Services Anexo: Algunos trucos en ASP .NET Cmo crear y leer controles dinmicamente en ASP .NET

I.S.T.Idat

ASP.NET

Aplicaciones Web PLATAFORMA MICROSOF.NET Microsoft .NET se compone de un conjunto de recursos que hacen posible su implementacin, estos componentes se muestran en la siguiente ilustracin:

VISUAL STUDIO.NET .NET Framework

Internet

.NET Enterprise .NET Building Servers Block Services

2. Servidores Empresariales.NET Microsoft Exchange Server: Ofrece servicios de mensajera (correo electrnico) y colaboracin entre aplicaciones (workflow). Microsoft Host Integration Server: Realiza la comunicacin entre sistemas Cliente/Servidor, aplicaciones Intranet o Internet con los sistemas legados por el negocio, tales como Mainframe o AS/400. Microsoft Internet Security and Aceleration Server: Antes llamado Proxy Server, ISA Server se usa para brindar seguridad en las comunicaciones por Internet. Microsoft SQL Server: Es el servidor de datos de Microsoft que permite crear soluciones de Data Warehouse y se integra con Microsoft Office. 3. Bloque de Servicios .NET El Bloque de Servicios .NFT se est construyendo como un conjunto de Servicios Web XML que permitan la integracin entre los usuarios y las aplicaciones clientes que corran en diferentes dispositivos (PCs, dispositivos mviles, etc). Actualmente Microsoft tiene construido dos servicios que ofrecen ventajas para los usuarios: Microsoft Passport: Tiene un conjunto de servicios como el Single Sign In (SSI) que permite autenticar si un usuario es vlido y puede participar en un sitio Web, aparte tiene otras ventajas como reducir el tiempo de autenticacin, guardar contenido personalizado. etc. Hotmail utiliza el servicio de Passport para la autenticacin de usuarios y guardar informacin de ste en el Web. Microsoft Hailstorm: Usa los servicios de Passport para guardar informacin personalizada del usuario, pero su uso principal es almacenar Servicios Web que puedan ser usados por aplicaciones de Visual Studio .NET o cualquier lenguaje compatible con .NET El Marco. NET Definiendo el Marco .NET Fl Marco .NET (en ingles .NET Framework) es la piedra angular de la plataforma .NET y constituye u.i enlomo para la creacin, distribucin y ejecucin de servicios Web, as como de otros tipos de aplicaciones.

I.S.T.Idat

ASP.NET

Aplicaciones Web Se compone de cuatro partes principales que son: 1. Tiempo de F-jccucin en Lenguaje Comn (CLR) Es el RunTime comn para todos los lenguajes que soportan el Marco .NET y realiza la mayor parte de funciones para que corran las aplicaciones.NET, es el que se encarga de compilar \ ejecutar una aplicacin, as como administrar su trabajo con el sistema. 2. Librera de Clases .NET Son un conjunto de componentes que sirven para acceder a travs de objetos a la mayor parte de servicios del sistema, labor que era realizada antes por las APIs de Windows, la MEC o ATL de Visual C++, etc. 3. ADO.NET. vs XML ADO .NET se usa para acceder a cualquier origen de datos sea relacional (bases de datos), formatos planos (textos), etc. Por su parte, XML sirve como el formato para intercambiar los datos en diferentes plataformas. 4. ASP.NET Este componente incluye el soporte para la creacin, distribucin y mantenimiento de aplicaciones Web as como de Servicios Web XML que son la razn de ser de la plataforma .NET TIEMPO DE EJECUCIN EN LENGUAJE COMN (CLR) Introduccin al RunTime y al CLR Un RunTime es la aplicacin responsable de manejar la asignacin de memoria, inicio y eliminacin de procesos mientras un programa se est ejecutando, as como de brindar seguridad al cdigo, y tambin gestionar su relacin con otros programas o componentes. l.os RunTime lian sido usados por los lenguajes de programacin como Visual Basic cuyo nombre es el VBRLN, Visual C++ cuyo nombre es MSVCRT. Pero tambin Visual FoxPro, JScnpt, SmaIlTalk. Per!, Python. Java, etc. tienen su propio RunTime. Cada aplicacin Visual Basic 6 que se quera distribuir tenia que distribuirse con el RunTime, lo mismo en Visual C-H-, la diferencia que el primero ocupaba demasiado espacio y no era tan poderoso como el segundo. EL RunTime de .NET se llama el CLR (Common Language RunTime o Tiempo de Ejecucin en Lenguaje Comn) y es la solucin a los diferentes tipos de RunTime que manejan los diferentes lenguajes de programacin antes mencionados, que ahora sern Gestionados en ejecucin por un nico RunTime comn. La ventaja de tener un solo RunTime son mltiples ya que se podr compartir las mismas estructuras, tipos de datos, clases, etc. en todos los lenguajes que cumplan las especificaciones del Marco .NET. Servidos del CLR El CLR es el motor de ejecucin de las aplicaciones del Marco .NET. Proporciona una serie de servicios, entre los que se incluyen los siguientes:

I.S.T.Idat

ASP.NET

Aplicaciones Web

Administracin del cdigo (carga y ejecucin). Aislamiento de la memoria de la aplicacin. Comprobacin de la seguridad de los tipos. Conversin del (Lenguaje Intermedio) a cdigo nativo Acceso a los metadatos (informacin de tipo mejorada) Administracin de memoria para los objetos administrados Aplicacin de seguridad de acceso al cdigo Control de excepciones, incluyendo excepciones en varios lenguajes Interoperabilidad entre el cdigo administrado, los objetos COM y las DLL anteriores (datos y cdigo no administrados) Automatizacin del diseo de objetos Suporte para servicios de desarrolladores (creacin de perfiles, depuracin, etc.) Sistema de auto registro o auto descripcin de componentes (no es necesario registrar el componente en el sistema) No es necesario los elementos de COM como GUIDs, interfases iLnknow, etc.

Nota: Con esto decimos adis al problema de la compatibilidad de versiones de las dll. Esta informacin se utiliza en tiempo de ejecucin para resolver referencias, aplicar las directivas del enlace de versiones y validar la integridad de los ensambladores cargados. El tiempo de ejecucin puede determinar y ubicar el ensamblador para cualquier objeto de ejecucin, ya que todos los tipos se cargan en el contexto de un ensamblador. Asimismo, los ensambladores constituyen la unidad en la que se aplican los permisos de seguridad de acceso al cdigo. La prueba de identidad de cada ensamblador se considera individualmente cuando .Se determinan los permisos que contiene para otorgar al cdigo. Espacio de Nombre Un espacio de nombre (NameSpace) es un esquema de denominacin lgica para los tipos en los que un nombre de tipo sencillo, como OLEDB. Va precedido de un nombre jerrquico separado por puntos. Dicho esquema se encuentra totalmente bajo el control del desarrollador. Las herramientas de diseo pueden utilizar los espacios de nombre para facilitar a los desarrolladores el proceso de exploracin y referencia a los tipos en su cdigo. El concepto de espacio de nombre no est relacionado con el del ensamblador. Un nico ensamblador puede contener tipos cuyos nombres jerrquicos dispongan de distintas races de espacio de nombre y una raz lgica de este tipo puede abarcar varios ensambladores. En el Marco .NET. un espacio de nombre es una conveniencia lgica de denominacin en tiempo de diseo, mientras que un ensamblador establece el mbito de nombre para los tipos en tiempo de ejecucin.

I.S.T.Idat

ASP.NET

Aplicaciones Web En Visual Basic, por ejemplo para hacer uso de un Assemblie hay que usar los espacios de nombre con la declaracin Imports, por ejemplo si quisiramos acceder a datos con SQL Server y manejar archivos de texto en una aplicacin Windows realizaramos la siguiente declaracin: Imports Systein.Windows.Forms Imports System.Data.SQL Imports System.10 CAPITULO 2: VISUAL STUDIO .NET Introduccin a Visual Studio .NET Definiendo Visual Studio .NET Visual Sludio .NET es la Herramienta Rpida de Desarrollo (RAD) de Microsoft para la siguiente generacin de Internet que son los Servicios Web XML. Esta herramienta permite la creacin de aplicaciones usando el Marco .NET, es decir usando el CLR, la Librera de Clases, ADO .NET, ASP .NET, etc. Es un software que brinda las herramientas necesarias para crear, distribuir, administrar gran facilidad, rapidez y bajo costo. Se puede crear aplicaciones Web directamente usando el Framework .NET y algn programa editor, por ejemplo el Bloc de Notas, pero el tiempo que llevara el desarrollo no justificara el ahorro de costos, en cambio, si se utiliza una herramienta como Visual Studio.NET el tiempo de desarrollo se reducira enormemente. Visual Studio .NET permite tambin la integracin y el uso cruzado de lenguajes de programacin: Visual Basic .NET. Visual C# .NET, Visual C-H- .NET y JScript .NET A diferencia de la versin anterior no existe Visual InterDev, ni Visual J++-, adems Visual FoxPro .NET no comparte tas caractersticas unificadas del Marco .NET Herramienta Rpida de Desarrollo (RAD) La principal ventaja de Visual Studio .NET es realizar la creacin de aplicaciones de forma fcil y rpida, tan solo con arrastrar y soltar objetos se pueden crear desde aplicaciones Windows hasta Servicios Web XML. Entre algunas de las ventajas del soporte RAD de Visual Studio tenemos: Creacin de Pginas Web mediante Formularios Web Visual Studio .NET incluye un diseador de pginas Web HTML y ASP .NET basado en formularios Web. El diseador permite arrastrar controles, clases de datos, y otros objetos y configurar sus propiedades como si fuese un formulario de una aplicacin para Windows. Creacin de Servicios Web XML dar mantenimiento a aplicaciones Web distribuidas que usan Servicios Web XML, todo esto con una

I.S.T.Idat

ASP.NET

Aplicaciones Web Para crear Servicios Web XML, Visual Studio .NET incluye una plantilla con Servicios Web de ejemplo, los cuales puedes modificar y personalizar a tu medida, eligiendo el lenguaje que deseas, que puede ser Visual Basic .NET, Visual C# .NET o Visual C++.NET Acceso a Servicios Web XML

Una vez creado los Servicios Web XML deben usarse en otras aplicaciones del negocio, para ello Visual Studio .NET cuenta con el Explorador de Servidores (Server Explorer) que permite ver los Servicios Web publicados y usarlos con solo un arrastre. Tambin podemos usar un Servicio Web haciendo referencia desde un proyecto mediante la opcin "Add Web Referente" del men "Project". Creacin de Componentes .NET

Crear componentes o controles de usuario es tan simple como crear un formulario, ya que usando la herencia se puede pasar todas las caractersticas de un objeto a otro, esto este presente en todos los objetos creados en Visual Studio .NET, sean visuales o no. Creacin de archivos XML Con el diseador de XML, crear un archivo XML es ms fcil que nunca, ya que se muestra de colores el cdigo y s auto completan los Tags que uno va escribiendo. Este Maneja 3 vistas: XML, esquemas y datos. Existen mas caractersticas RAD en Visual Studio .NET, las cuales trataremos mas adelante. Lenguajes en .NET En Visual Studio .NET vienen los siguientes Lenguajes de Programacin: Visual Basic .NET Visual C# .NET Visual C++ .NET Visual FoxPro .NET (No administrado por el Marco .NET) Visual JScript .NET

Qu es ASP.net?
El 20 de Enero del 2002 una nueva versin del tradicional Active Server Pages se ha lanzado al pblico, no es ASP 4.0 sino ASP.net. ASP.net forma parte del .NET Framework de Microsoft, junto con VB.net, C++.net, C# (algo as como una versin mejorada de C++) hasta incluso JScript.net. Pero, cal es la diferencia de ASP.net con el ASP comn que conocemos? Mucha, realmente es mucha. Mientras ASP se escriba en VBScript, ASP.net puede ser escrito en cualquier lenguaje soportado por el .net Framework, es decir: VB.net; C# y JScript.net. Si, como has ledo, ya no puedes utilizar VBScript sino que debes utilizar VB.net que es lo que ms se aproxima. Otro cambio radical es que ASP.net es un lenguaje totalmente orientado a objetos. Que mejoras trae ASP.net? Es realmente mejor que ASP?

I.S.T.Idat

ASP.NET

Aplicaciones Web Sin duda, es mucho mejor que el ASP tradicional, ASP.net trae diversas mejoras entre las cuales se destacan: Rendimiento: la aplicacin de compila en una sola vez al lenguaje nativo, y luego, en cada peticin tiene una compilacin Just In Time, es decir se compila desde el cdigo nativo, lo que permite mucho mejor rendimiento. Tambin permite el almacenamiento del cach en el servidor Rapidez en programacin: mediante diversos controles, podemos con unas pocas lneas y en menos de 5 minutos mostrar toda una base de datos y hacer rutinas complejas. Servicios Web: trae herramientas para compartir datos e informacin entre distintos sitios. Seguridad: tiene diversas herramientas que garantizan la seguridad de nuestras aplicaciones. Estructura de una pagina web.GESTION CON BASES DE DATOS (ADO.NET) ADO.NET es una tecnologa de acceso a datos que se basa en los objetos ADO (Objetos de Datos ActiveX) anteriores. Es una manera nueva de acceder a los datos construida sobre ADO. ADO.NET puede coexistir con ADO. Aunque usted no conozca ADO, en este captulo va a poder usar ADO.NET y ver con ejemplos, como conectarse a una Base de Datos. ADO.NET utiliza un modelo de acceso pensado para entornos desconectados. Esto quiere decir que la aplicacin se conecta al origen de datos, hace lo que tiene que hacer, por ejemplo seleccionar registros, los carga en memoria y se desconecta del origen de datos. ADO.NET es un conjunto de clases que usted utiliza para acceder y manipular orgenes de datos como por ejemplo, una base de datos en SQL Server o una planilla Excel. El modelo de objetos ADO.NET tiene dos componentes centrales: una capa conectada, con clases compuestas por el proveedor de datos .NET y una capa desconectada, cuya raz es DataSet.

El nuevo modelo de datos de microsoft es ado.net este modelo descansa en una serie de objetos especializados que facilitan el procesamiento de una base de datos.

I.S.T.Idat

ASP.NET

Aplicaciones Web

fuente microsoft.net El problema es comunicar un programa o aplicacin con una base de datos y ms que comunicar se pretende que el programa o aplicacin realize una serie de procesos u operaciones con la base de datos o mejor aun con el conjunto de tablas que contiene una base de datos. ADO.NET se encuentra en la biblioteca System.Data.dll, y ofrece clases en espacios de nombres bien diferenciados que explico brevemente a continuacin: System.Data: es el espacio de nombres primario. Dentro de este espacio de nombres tenemos un conjunto de clases que representan, digamos, una base de datos virtual, tablas, filas, columnas, relaciones, etc. Sin embargo, ninguna de estas clases ofrece conexin alguna con un origen de datos, sino que simplemente representan los datos en s mismos. System.Data.Common: ofrece clases comunes entre distintos orgenes de datos. Para lo que vamos a tratar en este artculo, podemos decir que estas clases sirven de clase base para las que estn contenidas en los dos espacios de nombres que vienen a continuacin. System.Data.OleDb: contiene una serie de clases que nos permiten conectarnos con cualquier origen de datos e interactuar con l al tiempo que sirven de "intermediarios" entre el origen de datos y las clases del espacio de nombres System.Data que, segn decamos, no tienen conexin alguna con dicho origen de datos. Las clases de System.Data.OleDb usan OLEDB como tecnologa subyacente.

I.S.T.Idat

ASP.NET

Aplicaciones Web System.Data.SqlClient: contiene clases que permiten interactuar con orgenes de datos SQL Server de un modo mucho ms directo que OLEDB, mejorando el rendimiento para este tipo de origen de datos. Por lo tanto, solamente se pueden utilizar para acceder a bases de datos de SQL Server. El uso de sus clases es prcticamente equivalente al de las que se encuentran en System.Data.OleDb.
Hay 3 espacios de nombres que usted va a importar en un formulario Web si esta usando ADO.NET: System.Data. System.Data.SqlClient. System.Data.OleDb.
Recuerde la sentencia que usa VB.NET para importar el espacio de nombres: Imports System.Data 'Siempre lo va a utilizar Imports System.Data.SqlClient 'Para acceder a SQL Server Imports System.Data.OleDb. 'Para cualquier origen de datos

LAS CLASES BSICAS DE ADO.NET


Las he llamado bsicas porque, realmente, sern el pilar fundamental para casi cualquier aplicacin que tenga que acceder a un origen de datos con unos mnimos requisitos de eficiencia y escalabilidad. Las clases ms importantes del espacio de nombres System.Data son: DataSet: Es la piedra angular del modelo de objetos: Esta clase permite tener en memoria una autntica "base de datos virtual", con sus tablas, relaciones, etc. Un hecho importante es que esta base de datos virtual est total y absolutamente desconectada de cualquier origen de datos fsico y, en consecuencia, siempre se aloja toda entera en la memoria. En otras palabras, puede contener uno o varios conjuntos de filas distintos, que pueden estar o no estar relacionados entre s, pero siempre en la memoria y siempre desconectados del origen de datos. La clase DataSet est dentro del espacio de nombres System.Data. DataTable: un DataTable representa un conjunto de filas y columnas tambin en memoria y desconectado del origen de datos, como el DataSet. Pertenece al espacio de nombres System.Data. La propiedad Tables de un objeto DataSet contiene una coleccin de objetos DataTable, y dicha coleccin es de la clase DataTableCollection. Por otra parte, cada objeto DataTable representa sus filas en la propiedad Rows (de la clase DataRowCollection), siendo cada

I.S.T.Idat

ASP.NET

Aplicaciones Web fila, a su vez, un objeto de la clase DataRow, y sus columnas en la propiedad Columns (de la clase DataColumnCollection), siendo cada columna un objeto de la clase DataColumn. DataRelation: representa una relacin entre dos objetos DataTable. Tambin pertenece al espacio de nombres System.Data. Todas las relaciones que haya en un DataSet se encuentran en la coleccin Relations, de la clase DataRelationCollection. Las clases ms importantes del espacio de nombres System.Data.SqlClient, y sus equivalentes en el espacio de nombres System.Data.OleDb: SqlConnection: su equivalente en OleDb es OleDbConnection. Son ms o menos equivalentes a la clase Connection del antiguo ADO, en tanto en cuanto que proporcionan la conexin con el origen de datos y mantiene algunas de sus antiguas propiedades y mtodos, como son ConnectionString, ConnectionTimeOut, Open y Close. Sin embargo, al igual que las otras clases que tambin tienen un equivalente (ms o menos) en la tecnologa antigua, ten presente que no se manejan exactamente igual, como tendremos ocasin de ver ms adelante. SqlCommand: su equivalente en OleDb es OleDbCommand. Tambin son parecidos a los antiguos objetos Command de ADO y, como estos, representan procedimientos almacenados o instrucciones SQL que se ejecutan en el origen de datos. SqlParameter: su equivalente en OleDb es OleDbParameter. Del mismo modo que los dos anteriores, se parecen a los objetos Paremeter del antiguo ADO, y representan un parmetro dentro de la coleccin Parameters del objeto SqlCommand u OleDbCommand, segn el caso. La coleccin Parameters de un objeto SqlCommand es de la clase SqlParameterCollection (OleDbParameterCollection en OleDb). SqlDataAdapter: su equivalente en OleDb es OleDbDataAdapter. Esta clase no tiene nada parecido (ni de lejos) en el antiguo ADO. Contiene un conjunto de objetos SqlCommand ( OleDbCommand, segn proceda) en sus propiedades SelectCommand, InsertCommand, UpdateCommand y DeleteCommand. Cuando se invoca el mtodo Fill, el DataAdapter rellena un objeto DataSet o DataTable con el conjunto de filas resultante de ejecutar el comando establecido en su propiedad SelectCommand. Cuando se invoca el mtodo Update, el DataAdapter ejecuta el comando establecido en su propiedad InsertCommand para aadir al origen de datos las filas nuevas aadidas a un DataTable, el comando UpdateCommand para modificar las filas que hayan sido modificadas en el DataTable y el comando DeleteCommand para eliminar las filas que hayan sido eliminadas en el DataTable. Por lo tanto, el DataAdapter es el nexo que une los objetos DataSet y DataTable, totalmente desconectados, con el origen de datos fsico. Si la conexin I.S.T.Idat 10 ASP.NET

Aplicaciones Web estaba cerrada antes de ejecutar los mtodos Fill o Update, el DataAdapter se ocupa de abrir dicha conexin para efectuar la operacin requerida, cerrando de nuevo la conexin una vez que ha terminado. Si la conexin estaba abierta, el DataAdapter deja que dicha conexin siga abierta despus de haber terminado. SqlCommandBuilder: su equivalente en OleDb es OleDbCommandBuilder. Tampoco haba nada en el antiguo ADO que hiciera lo que hace esta clase. Sencillamente se ocupa de generar los objetos command necesarios para un determinado DataAdapter, gracias a los mtodos GetInsertCommand, GetUpdateCommand y GetDeleteCommand.

Resumiendo

Objetos de Proveedores de Datos .NET

Propsito

Objeto SQL Server Objeto para un origen 7.0 o 2000 OLEDB

Connection Command DataReader

DataAdapter

Provee conectividad a un Origen de Datos Provee acceso a comandos de Base de Datos como Select, Delete, Insert y Update Provee acceso a datos de solo lectura Utiliza el objeto Connection para enlazar un objeto DataSet con un Proveedor de Datos. Tambin permite actualizar los Datos en el origen a partir de las modificaciones hechas en el DataSet.

SqlConnection SqlCommand

OleDBConnection OleDBCommand

SqlDataReader OleDBDataReader

SqlDataAdapter

OleDBDataAdapter

Un DataSet guarda informacin en un entorno desconectado. Despus de que usted establece una conexin con una Base de Datos entonces puede acceder a sus datos. El DataSet es la principal forma de guardar datos cuando usted utiliza ADO.NET El DataSet le permite a usted guardar datos que se obtuvieron de un origen de datos. Los datos en un DataSet pueden ser manipulados sin necesidad que el formulario Web mantenga la conexin con el origen de datos. La conexin se reestablece recin cuando usted necesita actualizar los cambios

Los datos siempre viajan en formato XML ASP.NET y ADO.NET transforman en forma automtica XML en un DataSet.

I.S.T.Idat

11

ASP.NET

Aplicaciones Web

Aplicaciones..- Listado de datos empleando los controles de BDD Se puede acceder al conjunto de servidores mediante(ver Explorador de servidores)

Vamos a crear una Base de Datos en el Servidor: Haga click en el nombre de su servidor. Presione el botn derecho del Mouse. Seleccione 'Nueva Base de Datos'

Control datagrid1
Hacer la conexin con Northwind y de la caja de herramientas arrastrar SqlConnection1(Haciendo referencia en propiedades a Northwind) , sqldataAdapter1 (configurando con la tabla Categories) y Dataset1 (Conjunto de datos) haciendo referencia a la configuracin anterior.

I.S.T.Idat

12

ASP.NET

Aplicaciones Web

Acciones de ida y vuelta Uno de los conceptos principales que debe comprender es la divisin del trabajo en una pgina de formularios Web Forms. El explorador presenta el formulario al usuario y ste interacta con l, causando que el formulario se enve de vuelta al servidor. Sin embargo, como todo procesamiento que interacta con componentes de servidor debe ocurrir en el servidor, esto significa que, para cada accin que necesita procesamiento, el formulario debe enviarse al servidor, procesarse y ser devuelto al explorador

Servidor .NET (Active Server Pages .NET). Es una tecnologa para generar pginas dinmicas en el servidor y enviarlas al cliente (navegador Web) que las ha solicitado, ejecutando previamente el cdigo que contienen (cdigo Visual Basic, C#, etc.) y convirtiendo el resultado a cdigo HTML, que es el nico que puede interpretar adecuadamente el cliente.

I.S.T.Idat

13

ASP.NET

Aplicaciones Web

La clave de este proceso es que, a diferencia de la navegacin clsica en que el sevidor espera (escucha) peticiones del cliente y, cuando las recibe, enva automticamente la respuesta (generalmente un documento HTML que es mostrado en el navegador Web), aqu el servidor ejecuta algn tipo

de procesamiento a raz de la peticin del

cliente y elabora dinmicamente la respuesta que devuelve. En esquema sera: El cliente (explorador Web) se conecta al servidor Web gracias a su URL El cliente enva una peticin al servidor (solicita una pgina Web). El cliente puede ejecutar cdigo (en el lado del cliente), con secuencias de comandos que se utilizan para generar efectos dinmicos en el cliente (DHTML). Este cdigo no se procesa en el servidor El servidor busca la pgina solicitada y ejecuta el cdigo contenido en ella. Este cdigo del lado del servidor se escribe en secuencias de comandos (para tareas simples) pero tambin en lenguajes compilados (Visual Basic, C#, etc., para tareas complejas como son clculos matemticos, recuperacin de datos, gestin de sitios, comercio electrnico, etc.) El servidor traduce el resultado de la ejecucin del cdigo a HTML y lo enva al cliente El cliente muestra al usuario el documento recibido. Si el usuario consulta el cdigo fuente del documento que visita, no ver el cdigo original del archivo que reside en el servidor, sino solamente cdigo HTML en que la tecnologa ASP .NET ha convertido el resultado del procesamiento CONFIGURACIN DE ASP .NET: para poder ejecutar pginas ASP .NET se necesita:

IIS (Internet Information Server): est disponible para Windows NT, Windows 2000, Windows XP Profesional y Windows .NET 2003. Dado que ASP .NET es una tecnologa de servidor, requiere un servidor Web en ejecucin, de ah la necesidad de IIS. Tericamente no se puede utilizar en Windows XP Home ya que no aparece como opcin en Agregar y quitar elementos de Windows pero, mediante unas maniobras sencillas, s es posible instalarlo en sistemas con Windows XP Home de manera que los poseedores de este sistema operativo tambin pueden aprender ASP .NET .

SDK (Kit de Desarrollo de Software) de .NET Framework: est disponible para Windows NT con SP6a, Windows 2000, Windows XP y Windows .NET 2003. Sin este componente, el servidor Web por s mismo no es capaz de interpretar adecuadamente las pginas ASP .NET. La instalacin de Visual Studio .NET conlleva automticamente la del SDK de .NET Framework.

I.S.T.Idat

14

ASP.NET

Aplicaciones Web Las pginas ASP .NET tienen la extensin aspx. Para visualizar adecuadamente una pgina aspx no basta con ejecutarla con doble clic o abrirla desde el explorador Web, de ambas maneras el documento se visualiza defectuosamente. Para que la pgina aspx funcione, debe ser filtrada por el servidor Web, por lo que es necesario dirigir el navegador Web a http://localhost (direccin de la mquina local) y ah a la direccin correcta del archivo aspx. COMPONENTES BSICOS DE UNA PGINA ASP .NET:

En la primera lnea destaca la directiva

<%@ Page Language="Vb" %>


que dice al servidor Web que se trata de una pgina ASP .NET y que usa Visual Basic .NET como lenguaje de programacin. Tambin podra ser

<%@ Page Language="Cs" %>


en caso de usar C# como lenguaje de programacin.

Despus de la directiva @ Page vienen bloques de declaracin de cdigo, en lenguaje Visual Basic .NET, incluidos en la etiqueta

<script runat=server><script>
Aqu es donde debe ir todo o la mayor parte del cdigo Visual Basic ya que este cdigo es el nico compilado a MSIL

Despus comienza el cdigo HTML. Este cdigo, junto con el resultado del cdigo ASP .NET, es enviado al cliente. En esta seccin puede haber bloques proveedores de cdigo con instrucciones adicionales en ASP .NET, estos bloques van entre las etiquetas <% y %> y no son compilados por lo que son menos eficientes que los bloques de declaracin de cdigo

Es fundamental tener una etiqueta Form con el atributo runat=server, ello convierte al formulario en un Formulario Web que es supervisado por ASP .NET

A lo largo del la pgina pueden aparecer elementos conocidos de HTML pero que se declaran de manera especial: <asp:textbox runat=server></asp:textbox>

I.S.T.Idat

15

ASP.NET

Aplicaciones Web Son controles Web, con algunas funcionalidades similares a las de los elementos HTML del mismo nombre pero con otras aadidas por ASP .NET SEPARACIN DE CDIGO VB Y CONTENIDO HTML: En muchas ocasiones es til mantener el contenido HTML de las pginas fuera del cdigo Visual Basic, aumenta la legibilidad del cdigo fuente de los archivos y facilita su modificacin por el programador. Se pueden usar formularios con cdigo de apoyo, llevando a estos formularios o archivos de cdigo *.vb todo el cdigo Visual Basic del archivo aspx y declarando en ellos versiones pblicas de los controles de servidor que se usan en la pgina. Por ejemplo, para una etiqueta llamada lbEtiqueta en el archivo aspx, se puede escribir en el archivo de cdigo: Public lbEtiqueta As Label de esa manera, el control de servidor lbEtiqueta (Label) de la pgina aspx es una instancia de la variable lbEtiqueta de la clase datagridVb declarada en el archivo vb y, desde el cdigo de la clase, se puede acceder a las propiedades del control a pesar de encontrarse en 2 archivos diferentes. Por ejemplo si se utiliza un archivo externo como cdigo de apoyo: - la pgina Asp .NET datagrid.aspx contiene solamente cdigo HTML con controles de servidor - el archivo de cdigo de apoyo datagrid.aspx.vb contiene el cdigo Visual Basic .NET con declaraciones de variables y procedimientos Ambos archivos han de estar juntos en la misma carpeta para que funcione el cdigo actual pero, como se ver ms adelante, pueden estar situados en carpetas diferentes. El archivo datagrid.aspx necesita de estos atributos en la directiva @ Page al comienzo del cdigo: - Si se trabaja fuera del entorno RAD de Visual Studio .NET (ej: editor de texto y servidor Web), se usa el atributo Inherits, que define la clase que hereda la pgina aspx (puede ser cualquier clase derivada de la clase Page), y el atributo Src, que especifica el archivo de cdigo fuente en el que se define la clase heredada (es compilado dinmicamente cuando se solicita la pgina aspx); este archivo puede estar situado en cualquier carpeta del servidor, slo hay que especificarlo correctamente en la ruta. As es como debe ser configurado al colocar las pginas en el servidor Web: <%@ Page Language="vb" Inherits="datagridVb" Src="datagrid.aspx.vb" %>

I.S.T.Idat

16

ASP.NET

Aplicaciones Web (aqu la pgina aspx hereda la clase datagridVb, que est descrita en el archivo datagrid.aspx.vb, que es compilado en tiempo de ejecucin) Si se trabaja en un entorno RAD como Visual Studio .NET, se usa el atributo Codebehind, que especifica el nombre del archivo compilado que contiene la clase asociada con la pgina (el diseador de formularios Web Forms de Visual Studio .NET usa este atributo para averiguar dnde se encuentra la clase derivada de Page, de forma que pueda crear una instancia de la misma para que se pueda trabajar con ella en tiempo de diseo) (Codebehind no se usa en tiempo de ejecucin), y el atributo Inherits, que define la clase que hereda la pgina aspx. As es como debe ser configurado mientras se trabaja con la pgina dentro de Visual Studio .NET: <%@ Page Language="vb" Codebehind="datagrid.aspx.vb" Inherits="datagrid.datagridVb" %> (aqu la pgina aspx utliiza el atributo Inherits para heredar la clase derivada de Page, la clase datagridVb, descrita en el archivo datagrid.aspx.vb, que es precompilado en segundo plano para poder probar la pgina a medida que se va construyendo) ESPACIOS DE NOMBRES Y HERENCIA: A su vez, en el archivo de cdigo de apoyo datagrid.aspx.vb, hay que importar determinados espacios de nombres, necesarios para utilizar ASP .NET, que no es necesario especificar cuando todo el cdigo va en la pgina aspx (Asp .NET lo hace automticamente por nosotros) y tambin heredar la clase Page (de System.Web.UI) al declarar la clase datagridVb: Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Public Class datagridVb : Inherits Page En este ejercicio en concreto tambin han de importarse los espacios de nombres Data y Data.OleDb para permitir el uso de ADO .NET: Imports System.Data Imports System.Data.OleDb Los operadores empleados.Operadores Aritmeticos ^ Exponenciacion * ,/ Multiplicacin y divisin real \ divisin entera Mod residuo de una divisin entera

Otros operadores complementarios Asigna y opera +=, -= ,*= , /= , ^= a=a+5 equivale a+=5

I.S.T.Idat

17

ASP.NET

Aplicaciones Web A=23\4 la respuesta es 5 A= 23 mod 4 Igualdad (=) Desigualdad (<>) Menor o mayor que (<,>) Mayor o igual que (>=) Menor o igual que (<=) Like Explicacin TypeOf...Is Conversin de tipos Var = CType(Val("10 * 25"), Integer) Con esto le estamos diciendo al VB que primero convierta la cadena en un nmero mediante la funcin Val, (que devuelve un nmero de tipo Double), despus le decimos que ese nmero Double lo convierta en un valor Integer. Tambin podramos hacerlo de esta otra forma: i = CInt(Val("10 * 25")) resultado 3 Operadores de comparacin

Nombre de la funcin

Tipo de Valores del argumento "expresion" datos que devuelve CBool(expresion) Boolean Cualquier valor de cadena o expresin numrica. CByte(expresion) Byte de 0 a 255; las fracciones se redondean. CChar(expresion) Char Cualquier expresin de cadena; los valores deben ser de 0 a 65535. CDate(expresion) Date Cualquier representacin vlida de una fecha o una hora. CDbl(expresion) Double Cualquier valor Duoble, ver la tabla anterior para los valores posibles.

I.S.T.Idat

18

ASP.NET

Aplicaciones Web

Enlaces de datos con los controles Web Form Aplicacin 1.- Sin incluir controles Form

Resultado

Codificacin.<%@ Page language="vb"%> <HTML> <body> <center> <form name="frmintro" method="post" action="demo1.aspx"> <h3>Primer Ejemplo</h3> <h3>Ingrese Su Nombre :<input type =text name = "nombre" value ="<%=request.form("nombre")%>"> Carrera : <select name="categoria" size=1> <% Dim i as integer Dim values() as string={"Ing. Sistemas","Medicina","Psicologia","Administracion"} for i=0 to values.length -1 %> <% if request.form("categoria")=values(i) then%> <option selected> <%else%> <option> <%end if%> <%=values(i)%></option> <%next%> </selected></h3> <input type =submit name="busqueda" value ="busqueda"> <%if(not request.form("busqueda")=nothing) then%> <p> Hola, <%=request.form("nombre")%>, has seleccionado la Carrera de : <% =request.form("categoria")%> </p> <%end if%> </form> </center>
I.S.T.Idat 19 ASP.NET

Aplicaciones Web

</body> </HTML> Aplicacin 2.- Segunda forma empleando etiquitas script

<html> <head> <script language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) If Not IsPostBack Then si la pagina no esta cargada Dim values as ArrayList= new ArrayList() values.Add ("Visual Net") values.Add ("Power Builder") values.Add ("Macromedia MX") values.Add ("Sql Server") values.Add ("Oracle") values.Add ("Linux") DropDown1.DataSource = values DropDown1.DataBind End If End Sub Sub SubmitBtn_Click(sender As Object, e As EventArgs) Label1.Text = "Su eleccin: " + DropDown1.SelectedItem.Text End Sub </script> </head> <body> <h3><font face="Verdana">Enlace de datos de DropDownList</font></h3> <form runat="server" ID="Form1"> <asp:DropDownList id="DropDown1" runat="server" /> <asp:button Text="Enviar" OnClick="SubmitBtn_Click" runat="server" ID="Button1" NAME="Button1" /> <p><asp:Label id="Label1" font-name="Verdana" font-size="10pt" runat="server" /> </form> </body> </html> Nota.En vez de un aria Lisa tambin se puede emplear un arreglo dinmico Dim values() as string={Visual Net, Power Builder, Macromedia Mx,sql server}
I.S.T.Idat 20 ASP.NET

Aplicaciones Web

Dropdown1.datasource=values 1.- Lo primero y ms importante a recordar es que en este modelo de programacin el codigo en
vbNet estar embebido o empotrado junto con codigo html. 2.- Este codigo mezcla instrucciones y objetos de dos lenguajes de programacin diferentes, ellos son HTML y vbNet. 3.- El problema es que los objetos HTML no tienen suficientes propiedades y mtodos para resolver muchos problemas de programacin, por esta razn Microsoft.Net crea unas cubiertas? (WRAPPERS) para cada uno de ellos, en su librera System.Web.UI.Control, o coleccin HTMLCONTROL, estos nuevos objetos o controles son: HtmlInputButton, HtmlInputCheckBox, HtmlInputFile, HtmlInputHiden, HtmlputImage, HtmlInputRaddioButton, HtmlInputText, HtmlAnchor, HtmlButton, HtmlForm, HtmlGenericControl, HtmlSelect, HtmlTable, HtmlTableCell, HtmlTableRow, HtmlTextArea, HtmlImage. Estos controles aceptan o pueden usar todas las propiedades originales de los objetos HTML y algunas nuevas propiedades y mtodos como se observa en el programa ejemplo. La nica propiedad que no se menciona y se usa en todos estos objetos htmlcontrol es runat="server" que se utiliza para indicarle al servidor de paginas que debe compilar y ejecutar el programa.aspx usando el lenguaje apropiado y solo mandarle el resultado de esta compilacin a la maquina cliente que lo pidi. 4.- El script o miniprograma empieza con <SCRIPT y termina con </SCRIPT>. 5.- Recordar respetar todas las ID de los objetos y las variables que se hayan declarado. 6.- La primera sopresa agradable comparada con los otros modelos de programacin es que de los objetos htmlcontrols se pueden manipular directamente sus propiedades y mtodos, es decir ya no hay necesidad ( aunque se puede) de usar los objetos tradicionales de ASP. 7.- Como se observa en el programa, se pueden manipular directamente los objetos HTML, y con un solo rengln de instruccin en vbnet se puede resolver el problema completo. Empleando Web Form con cdigos en Visual VB Comienza con una directiva o instruccin PAGE que en principio es el compilador de paginas de ASP.NET y su atributo INHERITS le indica a dicho compilador que use ejemplo.aspx y el codigo fuente o SouRCe que esta en el archivo llamado ejemplo.aspx.VB Aparte de la directiva PAGE, existen las siguientes:

ASP.NET PAG-LEVEL DIRECTIVES:

I.S.T.Idat

21

ASP.NET

Aplicaciones Web

DIRECTIVE @ Page @ Control @ Import @ Register @ Assembly

DESCRIPCION Define atributos usados para compilar paginas ASP.NET Define atributos usados para compilar controles de usuarios
Importa NAMESPACES desde la librera de clases de .NET

Define alias, tais, y otros parmetros para controles de usuarios y normales Identifica otros archivos ( assemblies) para enlazar a esta pagina

Aplicacin.- Ingresando un radio muestra su area en una etiqueta e ingresando una cadena o prrafo lo ordena de forma ascendente Ejemplos:

Cdigos
Public Class SystemClass Inherits System.Web.UI.Page Protected WithEvents txtRadius As System.Web.UI.WebControls.TextBox Protected WithEvents butCalculate As System.Web.UI.WebControls.Button Protected WithEvents txtSort As System.Web.UI.WebControls.TextBox Protected WithEvents butSort As System.Web.UI.WebControls.Button Protected WithEvents litResult As System.Web.UI.WebControls.Literal + codigo Generado Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

I.S.T.Idat

22

ASP.NET

Aplicaciones Web

'Put user code to initialize the page here End Sub Private Sub butCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butCalculate.Click ' Declare variables. Dim dblCircArea, dblRadius As Double ' Convert text input to a double (optional). If txtRadius.Text <> "" Then _ dblRadius = System.Convert.ToDouble(txtRadius.Text) ' Calculate area. dblCircArea = System.Math.PI * System.Math.Pow(dblRadius, 2) ' Display result. ShowResult(dblCircArea) End Sub Private Sub butSort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butSort.Click ' Declare an array. Dim arrSort As String() ' Place each word in an array element arrSort = txtSort.Text.Split(" ") ' Sort the array. System.Array.Sort(arrSort) ' Display result. ShowResult(String.Join(" ", arrSort)) End Sub Sub ShowResult(ByVal Result As String) litResult.Text = "<h3>Results</h3>" litResult.Text += "<p>Sorted string: <b>" + Result + "</b>" End Sub Sub ShowResult(ByVal Result As Double) litResult.Text = "<h3>Results</h3>" litResult.Text += "<p>The circle's area is: <b>" + Result.ToString() + "</b>" End Sub End Class
FUNCIONES CON NUMEROS

Funcion Abs Int

Devuelve Valor absoluto de un numero real Parte entera de un real

I.S.T.Idat

23

ASP.NET

Aplicaciones Web

Rnd Exp
El objeto Math.funciones

Un numero al azr entre 0 y 1 Exponecial de un numero real es decir e = 2.71828

Math. Reunid (nov. - Redondea, con ciertos nmeros de decimal Math. Round (3.45, 1) 'Returns 3.4. Math.Round(3.46, 1) 'Returns 3.5. Math.PI .- El valor de este campo es 3,14159265358979323846 Math.acos.- Devuelve el ngulo cuyo coseno es el nmero especificado Math.ceiling.- Devuelve el nmero entero ms pequeo mayor o igual que el nmero especificado. Math.ceiling(3.1) 4 Math.Floor.- Devuelve el nmero entero ms grande menor o igual que el nmero especificado Math.Floor(3.1) 3 Math.sqrt(n).- Devuelve la raz cuadrada de un nmero especificado. Math.pow(n).- Devuelve un nmero especificado elevado a la potencia especificada Funciones Fechas. Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la informacin relativa a la fecha y la hora. Dispone para ello de una declaracin de variable: Date. Una variable declarada como date puede contener una fecha, una fecha y una hora o una hora solamente.

Dim MyDate As Date Dim MyMonth As Integer MyDate = #2/12/1969# ' Assign a date. MyMonth = Month(MyDate) ' MyMonth contains 2. Now Devuelve la fecha y hora actual. WeekDay Devuelve el da de la semana (En nmero, 1=Domingo, 2=Lunes,...) Dim MyDate As Date Dim MyWeekDay As Integer MyDate = #2/12/1969# ' asigna una fecha MyWeekDay = Weekday(MyDate) ' MyWeekDay contains 4 Day Obtiene el da, a partir de una fecha Dim MyDate As Date Dim MyDay As Integer MyDate = #2/12/1969# . MyDay = Microsoft.VisualBasic.Day(MyDate) ' MyDay contains 12. Month Obtiene el mes a partir de una fecha.

MyMonth = Month(MyDate) ' MyMonth contains 2.


Year
MyYear

Obtiene el ao a partir de una fecha.


= Year(MyDate) ' MyYear contains 1969.

Hour Minute
I.S.T.Idat

Obtiene la hora a partir de una hora Obtiene el minuto a partir de una hora.
24 ASP.NET

Aplicaciones Web

Second DateAdd
Interval

Obtiene el segundo a partir de una hora. Aade un intervalo de tiempo a una fecha

Requerido. Valor de enumeracin DateInterval o expresin String que representa el intervalo de tiempo que se desea agregar. Number Requerido. Double. Expresin de punto flotante que representa el nmero de intervalos que se desea agregar. Number puede ser un valor positivo (para obtener fechas u horas futuras) o negativo (para obtener fechas u horas pasadas). Puede contener una parte decimal cuando Interval especifica horas, minutos o segundos. Para otros valores de Interval, se omite cualquier parte decimal de Number. DateValue Requerido. Date. Expresin que representa la fecha y la hora a la que debe agregarse el intervalo. El propio DateValue no se modifica en el programa que realiza la llamada.

Valores

El argumento Interval puede tener uno de los siguientes valores: Valor de enumeracin Cadena Unidad de intervalo de tiempo agregada DateInterval.Day d Da; truncado al valor integral DateInterval.DayOfYear y Da; truncado al valor integral DateInterval.Hour h Hora; redondeada al milisegundo ms cercano DateInterval.Minute n Minuto; redondeado al milisegundo ms cercano DateInterval.Month m Mes; truncado al valor integral DateInterval.Quarter q Trimestre; truncado al valor integral DateInterval.Second s Segundo; redondeado al milisegundo ms cercano DateInterval.Weekday w Da; truncado al valor integral DateInterval.WeekOfYear ww Semana; truncada al valor integral DateInterval.Year yyyy Ao; truncado al valor integral
Dim NextTime As Date = Now ' Current date and time. NextTime = NextTime.AddDays(3.4) ' Increment by 3 2/5 days.
En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra la fecha correspondiente un nmero especificado de meses en el futuro.

Dim Msg, Number, StartDate As String 'Declare variables. Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month ' Especifica intervalos en meses. StartDate = InputBox("Ingrese fecha ") SecondDate = CDate(StartDate)
I.S.T.Idat 25 ASP.NET

Aplicaciones Web

Number = InputBox("Ingrsa el numero de meses a adicionar") Months = Val(Number) Msg = "New date: " & DateAdd(IntervalType, Months, SecondDate) Aplicacin con Datgrid pero sin conexin a BDD

RequieredFieldValidator.-(valida2) Errormensage Campo oblugatorio ControlTovalidate:Txtmon RangeValidator (Valida1) ErrorMessage.- Mes entre 6- 18 ControlTovalidate.- Txtmes ValidationSummary .- Resumen de errores

Public Class WebForm3 Inherits System.Web.UI.Page +codigo Generado Dim dt As DataTable Dim dr As DataRow Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub BtnCalcula_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCalcula.Click Dim m, mes As Integer Dim interes, monto, mactual As Double Dim fecha As Date = Date.Now mes = Val(txtmes.Text) monto = Val(txtmon.Text) dt = New DataTable() dt.Columns.Add(New DataColumn("Mes")) dt.Columns.Add(New DataColumn("Interes"))

I.S.T.Idat

26

ASP.NET

Aplicaciones Web dt.Columns.Add(New DataColumn("Monto")) For m = 1 To mes interes = monto * 0.01 * m mactual = interes + monto fecha = DateAdd("m", 1, fecha) dr = dt.NewRow() dr(0) = Format(fecha, "dd/MM/yy") ' si escribe la m con minuscula asumira como m en minutos dr(1) = interes.ToString() dr(2) = mactual.ToString 'Adiciona una fila al datatable dt.Rows.Add(dr) Next DataGrid1.DataSource = New DataView(dt) DataGrid1.DataBind() End Sub End Class Aplicacion empleando Hipervnculos en un formulario Se ingresa el cdigo del cliente, si existe muestra su orden y al hacer un clic en ver detalle muestra el detalle de ese pedido

En el datagrid1 en generador de proiedades:

I.S.T.Idat

27

ASP.NET

Aplicaciones Web

Dar el encabezado para cada columna en columna enlzada Y en columna Hipervnculo llamar al formulario Frmdetalle.aspx pasando el numero de orden={0}

I.S.T.Idat

28

ASP.NET

Aplicaciones Web

Formulario FRMDETALLE.ASPX

Codificacin en el formulario FRMOrden.aspx Imports System.Data.SqlClient Public Class weborden Inherits System.Web.UI.Page Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox Protected WithEvents BtnBusca As System.Web.UI.WebControls.Button Protected WithEvents Lbmensaje As System.Web.UI.WebControls.Label Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label2 As System.Web.UI.WebControls.Label Protected WithEvents Label3 As System.Web.UI.WebControls.Label Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid + Cdigo generado por el Diseador de Web Forms " Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub BtnBusca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBusca.Click Dim cn As New SqlConnection("uid=sa;database=northwind;server=(local)") Dim objda As New SqlDataAdapter("select OrderId,OrderDate,Freight from orders where customerid='" + TextBox1.Text + "'", cn) Dim objds As New DataSet() Dim NRO As Integer objda.Fill(objds) DataGrid1.DataSource = objds DataGrid1.DataBind() NRO = DataGrid1.Items.Count If NRO > 0 Then

I.S.T.Idat

29

ASP.NET

Aplicaciones Web

Lbmensaje.Text = NRO Else Lbmensaje.Text = "NO EXISTE CLIENTE" End If End Sub End Class
Codificacin FRMDETALLE.ASPX pasando el numero de pedido (orden) Codificacin

Imports System.Data.SqlClient Public Class FrmDetalle Inherits System.Web.UI.Page Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label2 As System.Web.UI.WebControls.Label Protected WithEvents Lbtot As System.Web.UI.WebControls.Label Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink Protected WithEvents LBNRO As System.Web.UI.WebControls.Label +Region " Cdigo generado por el Diseador de Web Forms " Dim cn As New SqlConnection("uid=sa;database=northwind;server=(local)") Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina Dim SQL As String SQL = "SELECT ProductName,Quantity,p.UnitPrice,Total=Quantity*P.UnitPrice " SQL += " from [order Details] D Inner Join Products P on P.Productid=D.ProductId " SQL += " where OrderId=" + Request.QueryString("orden") Dim objda As New SqlDataAdapter(SQL, cn) Dim objds As New DataSet() Dim NRO, F As Integer Dim sm As Double objda.Fill(objds) DataGrid1.DataSource = objds DataGrid1.DataBind() LBNRO.Text = Request.QueryString("orden") NRO = DataGrid1.Items.Count determina cuantas filas hay en el grid If NRO > 0 Then Dim dr As DataTable variable tipo tabla dr = objds.Tables(0) asigna la tabla del dataset sm = 0 For F = 0 To NRO 1 recorre la tabla pero de la columna total (3) sm += dr.Rows(F).Item(3) Next Lbtot.Text = sm End If End Sub

I.S.T.Idat

30

ASP.NET

Aplicaciones Web

End Class
Aplicacin Consulta en cascada .- en un DropDownList1 colocar los nombres de los clientes (CompanyName) pero cuando se elige un cliente que acceda a su cdigo CustomerId , mostrando en DropDownList2 todos sus pedidos y al elegir un pedido que muestre el detalle de ese pedido

Controles empleados

DropDwonList2 (para Clientes) DropDownList1 Para pedidos Ambos colocar en la propiedad: AutoPostBack=True Para que pueda seleccionarse Un Datagrid1 y una etiquita LBtot

Imports System.Data.SqlClient Public Class webpedidos Inherits System.Web.UI.Page Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid Protected WithEvents DropDownList1 As System.Web.UI.WebControls.DropDownList Protected WithEvents DropDownList2 As System.Web.UI.WebControls.DropDownList Protected WithEvents Label3 As System.Web.UI.WebControls.Label Protected WithEvents Label4 As System.Web.UI.WebControls.Label Protected WithEvents Lbtot As System.Web.UI.WebControls.Label Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label5 As System.Web.UI.WebControls.Label + " Cdigo generado por el Diseador de Web Forms " Dim cadcon = "uid=sa; database=northwind;server=(local)" Dim cn As New SqlConnection(cadcon) Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina

I.S.T.Idat

31

ASP.NET

Aplicaciones Web

If Not IsPostBack Then clientes() Si la pagina no ha sido cargada End If End Sub Sub clientes() Dim ds As New DataSet() Dim da As New SqlDataAdapter("select Customerid, Companyname from Customers", cn) da.Fill(ds, "Cliente") DropDownList2.DataSource = ds DropDownList2.DataTextField = "Companyname" ' Muestra el Nombre DropDownList2.DataValueField = "Customerid" 'Para acceder a su codigo DropDownList2.DataBind() da.Dispose() cn.Dispose() End Sub Sub verpedidos() Dim ds As New DataSet() Dim da As New SqlDataAdapter("select * from orders where customerid='" + DropDownList2.SelectedItem.Value + "'", cn) da.Fill(ds, "orden") DropDownList1.DataSource = ds DropDownList1.DataTextField = "orderid" 'DropDownList1.DataValueField = "orderid" DropDownList1.DataBind() da.Dispose() cn.Dispose() End Sub Sub VerDetalle() Dim da As SqlDataAdapter Dim sql As String Dim ds As New DataSet() sql = "SELECT ProductName,Quantity,p.UnitPrice,Total=Quantity*P.UnitPrice " sql += " from [order Details] D Inner Join Products P on P.Productid=D.ProductId " sql += " where OrderId=" + Me.DropDownList1.SelectedItem.Text da = New SqlDataAdapter(sql, cn) da.Fill(ds) DataGrid1.DataSource = ds DataGrid1.DataBind() Dim sm As Single Dim f As Integer Dim dt As DataTable sm = 0 dt = ds.Tables(0) For f = 0 To dt.DefaultView.Count - 1 sm = sm + dt.Rows(f).Item(3) Next Lbtot.Text = sm.ToString End Sub

I.S.T.Idat

32

ASP.NET

Aplicaciones Web

Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged VerDetalle() End Sub Private Sub DropDownList2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropDownList2.SelectedIndexChanged verpedidos() End Sub End Class
Aplicacion.Empleando el espacio de trabajo system.data.oledb el cual se puede aplicar a cualquier BBD como oracle, sysbase, Access , etc. Porque la conexin es a traves de un proveedor, la aplicacin consiste en seleccionador un cliente desde un DropDwonList , ademas buscar el detalle pedido del mayor monto. Aspnet

I.S.T.Idat

33

ASP.NET

Aplicaciones Web

Imports System.Data.SqlClient Imports System.Data.OleDb Imports System.Text Public Class Clientes Inherits System.Web.UI.Page Protected WithEvents CboCustomer As System.Web.UI.WebControls.DropDownList Protected WithEvents BtnBuscar As System.Web.UI.WebControls.Button Protected WithEvents BtnRegresar As System.Web.UI.WebControls.Button Protected WithEvents BtnMayor As System.Web.UI.WebControls.Button Protected WithEvents Label2 As System.Web.UI.WebControls.Label Protected WithEvents DgdOrdenes As System.Web.UI.WebControls.DataGrid Protected WithEvents Label3 As System.Web.UI.WebControls.Label Protected WithEvents DgdDetalle As System.Web.UI.WebControls.DataGrid Protected WithEvents Label4 As System.Web.UI.WebControls.Label Protected WithEvents Label1 As System.Web.UI.WebControls.Label + codigo Generado Cdigo generado por el Diseador de Web Forms " Dim OCon As OleDb.OleDbConnection Dim SCon As String Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina Dim Sql As String SCon = "Provider=SqlOleDb;uid=sa;pwd=;database=northwind;server=(local)" OCon = New OleDb.OleDbConnection(SCon) Sql = "Select * From Customers" Dim Cmd As OleDb.OleDbCommand Cmd = New OleDb.OleDbCommand(Sql, OCon) Cmd.Connection.Open() Dim OReader As OleDb.OleDbDataReader OReader = Cmd.ExecuteReader While OReader.Read CboCustomer.Items.Add(OReader.GetString(1)) CboCustomer.Items(CboCustomer.Items.Count - 1).Value = OReader.GetString(0) End While OReader.Close() End Sub Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBuscar.Click Dim SSql As StringBuilder Dim XCustomerId As String SSql = New StringBuilder("Select O.OrderId, O.ShipCountry, O.OrderDate, Sum(D.UnitPrice * D.Quantity) As Monto From Orders O, [Order Details] D Where O.OrderId = D.OrderId And CustomerId = '")

I.S.T.Idat

34

ASP.NET

Aplicaciones Web XCustomerId = Me.CboCustomer.SelectedItem.Value SSql.Append(XCustomerId) SSql.Append("' Group By O.CustomerId, O.OrderId, O.ShipCountry, O.OrderDate") Dim Cmd As New OleDb.OleDbCommand(SSql.ToString, OCon) Dim OReader = Cmd.ExecuteReader DgdOrdenes.DataSource = OReader DgdOrdenes.DataBind() DgdDetalle.DataSource = "" DgdDetalle.DataBind() End Sub Private Sub BtnMayor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMayor.Click Dim WSql As String Dim WCustomerId As String Dim WOrderId As String WCustomerId = Me.CboCustomer.SelectedItem.Value WSql = "Select Top 1 O.OrderId, Sum(D.UnitPrice * D.Quantity) As Monto From Orders O, [Order Details] D Where O.OrderId = D.OrderId And CustomerId = '" + WCustomerId + "' Group By O.CustomerId, O.OrderId Order By Monto Desc" Dim WCmd As New OleDb.OleDbCommand(WSql, OCon) Dim WReader As OleDb.OleDbDataReader WReader = WCmd.ExecuteReader While WReader.Read() WOrderId = WReader(0) End While WReader.Close() 'Llenar el Detalle del Grid de Mayor Monto Dim YSql As StringBuilder Dim YCustomerId As String YSql = New StringBuilder("Select D.OrderId, D.ProductId, P.ProductName, D.UnitPrice, D.Quantity, D.UnitPrice * D.Quantity As SubTotal From [Order Details] D, Products P Where D.ProductId = P.ProductId And OrderId = '") YSql.Append(WOrderId) YSql.Append("' Order By P.ProductId") Dim YCmd As New OleDb.OleDbCommand(YSql.ToString, OCon) Dim YReader = YCmd.ExecuteReader DgdDetalle.DataSource = YReader DgdDetalle.DataBind() End Sub Private Sub BtnRegresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnRegresar.Click

I.S.T.Idat

35

ASP.NET

Aplicaciones Web Response.Redirect("Menu.aspx") End Sub End Class

Aplicacin con Web Form Empleando la BDD Universidad Adicin y eliminacin e datos sin emplear Store Procedure

Codificacin.Autor : A. Moreno Imports System.Data.SqlClient Public Class WebForm1 Inherits System.Web.UI.Page Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox Protected WithEvents TextBox3 As System.Web.UI.WebControls.TextBox Dim cadcon = "uid=sa; database=Universidad;server=(local)" Dim cn As New SqlConnection(cadcon) Protected WithEvents Button3 As System.Web.UI.WebControls.Button Dim ds As DataSet + Cdigo generado por el Diseador de Web Forms " Dim da As SqlDataAdapter Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
I.S.T.Idat 36 ASP.NET

Aplicaciones Web

'Introducir aqu el cdigo de usuario para inicializar la pgina Button1.Enabled = False llena() End Sub Sub llena() ds = New DataSet() Para mostrar la lista de curso da = New SqlDataAdapter("select * from curso", cn) da.Fill(ds) DataGrid1.DataSource = ds DataGrid1.DataBind() End Sub Private Sub BtNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim nf, nro As Integer Dim cad As String nf = ds.Tables(0).DefaultView.Count - 1 nro = CInt(Right(ds.Tables(0).Rows(nf).Item(0), 3)) + 1 cad = "C" & Format(nro, "000") TextBox1.Text = cad Button1.Enabled = True End Sub Private Sub BtnGraba_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cmd As SqlCommand Dim prm As SqlParameter Dim sql As String sql = "insert into curso values(@codc,@nomc,@nhr)" cn.Open() cmd = New SqlCommand(sql, cn) 'Primera forma 'prm = cmd.Parameters.Add("@codc", SqlDbType.Char, 4) 'prm.Direction = ParameterDirection.Input 'prm.Value = TextBox1.Text 'prm = cmd.Parameters.Add("@nomc", SqlDbType.VarChar, 35) 'prm.Direction = ParameterDirection.Input 'prm.Value = TextBox2.Text 'prm = cmd.Parameters.Add("@nhr", SqlDbType.Int) 'prm.Direction = ParameterDirection.Input 'prm.Value = TextBox3.Text 'Segunda forma cmd.Parameters.Add("@codc", TextBox1.Text) cmd.Parameters.Add("@nomc", TextBox2.Text) cmd.Parameters.Add("@nhr", CInt(TextBox3.Text)) cmd.ExecuteNonQuery() cmd.Dispose() cn.Close() llena()

I.S.T.Idat

37

ASP.NET

Aplicaciones Web

Button1.Enabled = False End Sub Private Sub BTnAnula_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim sql As String Dim prm As SqlParameter cn.Open() sql = "delete from curso where idcurso=@cod" Dim cmd As New SqlCommand(sql, cn) cmd.Parameters.Add("@codc", TextBox1.Text) cmd.ExecuteNonQuery() cmd.Dispose() cn.Close() llena() End Sub End Class
Aplicacin mantenimiento a una tabla.Mantenimento a la tabla alumno empleando Store Procedure Para insertar o adicionar nuevos alumnos

create Procedure sP_ADIaLU @COD CHAR(5),@APE VARCHAR(30),@Nom varchar(30), @idesp char(3), @pro as char(1) as insert into alumno values(@cod,@ape,@nom,@idesp,@pro) return Para anular create Procedure SP_DELALU @COD CHAR(5) as delete from alumno where idalumno=@cod return

I.S.T.Idat

38

ASP.NET

Aplicaciones Web

Autor: A. Moreno Imports System.Data.OleDb Imports System.Text Public Class wegadiciona Inherits System.Web.UI.Page Protected WithEvents BtnAnula As System.Web.UI.WebControls.Button Dim CN As New OleDbConnection("PROVIDER=SQLOLEDB;UID=SA;DATABASE=UNIVERSIDAD;SER VER=(LOCAL)") + Cdigo generado por el Diseador de Web Forms " Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina Dim CMD As New OleDbCommand() If Page.IsPostBack = False Then CN.Open() With CMD .Connection = CN .CommandType = CommandType.Text .CommandText = "SELECT * FROM ESPECIALIDAD" End With Dim DA As New OleDbDataAdapter(CMD) Dim DS As New DataSet()

I.S.T.Idat

39

ASP.NET

Aplicaciones Web

DA.Fill(DS) cbe.DataSource = DS cbe.DataTextField = "NOMESP" cbe.DataValueField = "IDESP" cbe.DataBind() DA.Dispose() CMD.Dispose() CN.Close() DGD() End If End Sub Public Function DGD() Dim cmd As New OleDb.OleDbCommand() CN.Open() cmd.Connection = CN cmd.CommandType = CommandType.Text cmd.CommandText = "select * from alumno" Dim da As New OleDbDataAdapter(cmd) Dim ds As New DataSet() da.Fill(ds) Me.DataGrid1.DataSource = ds.Tables(0).DefaultView Me.DataGrid1.DataBind() cmd.Dispose() CN.Close() End Function Private Sub btnuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnuevo.Click Dim CMD As New OleDbCommand() CN.Open() With CMD .Connection = CN .CommandType = CommandType.Text .CommandText = "SELECT ISNULL(MAX(IDALUMNO),'A0000') FROM ALUMNO" End With Dim CAD As String = CMD.ExecuteScalar Dim NRO As Integer NRO = Val(CAD.Substring(1, 4)) + 1 TextBox1.Text = "A" + Format(NRO, "0000") CN.Close() End Sub Private Sub btngraba_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btngraba.Click Dim cmd As New OleDbCommand() Dim prm As OleDbParameter CN.Open() With cmd .Connection = CN

I.S.T.Idat

40

ASP.NET

Aplicaciones Web

.CommandType = CommandType.StoredProcedure .CommandText = "sp_adialu" End With prm = cmd.Parameters.Add("@cod", OleDbType.Char, 5) prm.Direction = ParameterDirection.Input prm.Value = TextBox1.Text prm = cmd.Parameters.Add("@ape", OleDbType.VarChar, 30) prm.Direction = ParameterDirection.Input prm.Value = txtape.Text prm = cmd.Parameters.Add("@nom", OleDbType.VarChar, 30) prm.Direction = ParameterDirection.Input prm.Value = txtnom.Text prm = cmd.Parameters.Add("@idesp", OleDbType.Char, 3) prm.Direction = ParameterDirection.Input prm.Value = cbe.SelectedItem.Value prm = cmd.Parameters.Add("@pro", OleDbType.Char, 1) prm.Direction = ParameterDirection.Input prm.Value = rbp.SelectedItem.Value cmd.ExecuteNonQuery() cmd.Dispose() CN.Close() DGD() End Sub Private Sub BtnAnula_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnula.Click Dim sql As String Dim cmd As New OleDbCommand() Dim prm As OleDbParameter CN.Open() With cmd .Connection = CN .CommandType = CommandType.StoredProcedure .CommandText = "sp_delalu" End With prm = cmd.Parameters.Add("@cod", OleDbType.Char, 5) prm.Direction = ParameterDirection.Input prm.Value = TextBox1.Text CN.Open() cmd.ExecuteNonQuery() cmd.Dispose() CN.Close() DGD() 'Llama al listado End Sub End Class

I.S.T.Idat

41

ASP.NET

Aplicaciones Web

Paginacion en un listado Cuando la lista de datos es muy grande es necesario hacer la paginacin del listado

Imports System.Data Imports System.Data.SqlClient Public Class PAGINACION Inherits System.Web.UI.Page Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents DGDPRODUCTO As System.Web.UI.WebControls.DataGrid + Cdigo generado por el Diseador de Web Forms " Public Sub CARGAR_DATO() Dim CN As New SqlConnection("UID=SA;PWD=;DATABASE=NORTHWIND;SERVER=.") Dim DA As New SqlDataAdapter("SELECT Codigo=ProductId,Descripcion =Productname, Precio=UnitPrice ,Stock=UnitsinStock FROM PRODUCTS", CN) Dim DS As New DataSet() DA.Fill(DS) DGDPRODUCTO.DataSource = DS.Tables(0).DefaultView DGDPRODUCTO.DataBind() End Sub Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If(not Page.ispostBack) then CARGAR_DATO() End if End Sub Public Sub PAGINAR(ByVal MIOBJETO As Object, ByVal MIEVENTO As DataGridPageChangedEventArgs) DGDPRODUCTO.CurrentPageIndex = MIEVENTO.NewPageIndex CARGAR_DATO() End Sub

I.S.T.Idat

42

ASP.NET

Aplicaciones Web

End Class

I.S.T.Idat

43

ASP.NET

Aplicaciones Web

Edicin, y Eliminacin de Registros en Lnea


Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacin o para corregir algn error de captura original o para agregar alguna columna que no exista por modificacin de la tabla o la base de datos. En general se tiene otro problema de SQL UPDATE, sin embargo ahora se aprovechan algunos elementos nuevos del objeto datagrid, como son la capacidad que tiene de crearle columnas de edicin a los renglones que muestra el dataset, estas columnas de edicin traen sus propios mtodos, mismos que se pueden cargar con codigo para procesar Instrucciones empleadas.Itemcommand Se produce cuando se hace clic en cualquier botn del control DataGrid. El controlador de eventos recibe un argumento de tipo DataGridCommandEventArgs que contiene datos relacionados con el evento. Las siguientes propiedades de

DataGridCommandEventArgs proporcionan informacin especfica para el evento Propiedad Descripcin CommandArgument (se hereda de Obtiene el argumento del comando. CommandEventArgs) CommandName (se hereda de Obtiene el nombre del comando. CommandEventArgs) CommandSource Obtiene el origen del comando. Item Obtiene el elemento que contiene el origen del comando en el control DataGrid.
Este evento suele utilizarse para controlar los controles de botones con un valor CommandName personalizado en el control DataGrid Utilice en Propiedades del datagrid la coleccin DataKeys para obtener acceso a los valores clave de cada registro (que se muestra en forma de fila) de un control de lista de datos. Esto permite almacenar el campo clave con un control de lista de datos, sin mostrarlo en el propio control. La coleccin se llena automticamente con los valores del campo especificado por la propiedad DataKeyField. El campo clave se suele utilizar en un controlador de evento, como por ejemplo ItemCommand o DeleteCommand, como parte de una cadena de consulta de actualizacin para la revisin de un registro especfico del origen de datos. El campo clave ayuda a la cadena de consulta de actualizacin a identificar el registro apropiado que se debe modificar. Para obtener ms informacin sobre cmo obtener acceso a datos con ASP.NET, vea Acceso a datos con ASP.NET. DatakeyField

I.S.T.Idat

44

ASP.NET

Aplicaciones Web Obtiene o establece el campo clave del origen de datos especificado por la propiedad DataSource. Valor de la propiedad Nombre del campo clave del origen de datos especificado por la propiedad DataSource. Comentarios Utilice la propiedad DataKeyField para especificar el campo clave del origen de datos indicado por la propiedad DataSource. El campo especificado se utiliza para rellenar la coleccin DataKeys. Esto permite almacenar el campo clave con un control de lista de datos, sin mostrarlo en el propio control. El campo clave se suele utilizar en un controlador de evento, como por ejemplo ItemCommand o DeleteCommand, como parte de una cadena de consulta de actualizacin para la revisin de un registro especfico del origen de datos. El campo clave ayuda a la cadena de consulta de actualizacin a identificar el registro apropiado que se debe modificar La propiedad CommandArgument puede contener cualquier cadena establecida por el programador. La propiedad CommandArgument complementa la propiedad CommandName ya que permite facilitar informacin adicional para el comando. Por ejemplo, se puede establecer la propiedad CommandName en Sort y la propiedad CommandArgument en Ascending para especificar un comando con el fin de organizar en orden ascendente. Utilice la propiedad CommandName para determinar el comando que se va a ejecutar. La propiedad CommandName puede contener cualquier cadena establecida por el programador. Posteriormente, el programador podr identificar el nombre de comando en el cdigo y llevar a cabo las tareas pertinentes. La propiedad Item se utiliza para obtener acceso a las propiedades del elemento seleccionado en el control DataGrid. Ejemplo [Visual Basic, C#] En el siguiente ejemplo se muestra cmo recuperar la descripcin y el precio de un elemento del control DataGrid mediante la propiedad Item. [Visual Basic]

Sub Grid_CartCommand(sender As Object, e As DataGridCommandEventArgs) ' e.Item Es una fila de la tabla que es seleccionada. ' Para las columnas enlazadas, Los valores almacenados con la propiedad TableCell. Dim itemCell As TableCell = e.Item.Cells(2) Dim priceCell As TableCell = e.Item.Cells(3) Dim item As String = itemCell.Text Dim price As String = priceCell.Text If CType(e.CommandSource, Button).CommandName = "AddToCart" Then

I.S.T.Idat

45

ASP.NET

Aplicaciones Web

' Insert code to add an item to the cart. Else ' Insert code to remove an item from the cart. End If ShoppingCart.DataBind() End Sub 'Grid_CartCommand

Edicin y Modificacin
DataGrid.- con el nombre Grid DataKeyField: Cli_codigo, colocar en las cajas de textos : Txtncod, Txtnom, txtdireccion y txtruc

Pasos : a) En el datagrid hacer Clic derecho: utilizar generador de propiedades:

I.S.T.Idat

46

ASP.NET

Aplicaciones Web

Enlazar en cada columna con los nombres de los campos en forma a priori, estos campos tienen que ser seleccionados en la instruccin select Codifiacion:

<%@Import Namespace="System.Data.SqlClient"%> <%@Import Namespace="System.Data"%> <%@Import Namespace="Microsoft.VisualBasic"%> <HTML> <HEAD> <SCRIPT language="vb" runat="server"> Dim Cn as SqlConnection Dim Cmd as SqlCommand Dim StrSql as String Sub Page_Load Cn=New SqlConnection("Server=(Local);Uid=Sa;Database=Bdfactura") if Not Page.Ispostback then EnlaceGrid End if End Sub Sub EnlaceGrid Cmd= new SqlCommand("Select cli_codigo,Cli_nombre,cli_direccion,Cli_Ruc From Clientes",Cn) Cn.Open()

I.S.T.Idat

47

ASP.NET

Aplicaciones Web

Grid.datasource=Cmd.executeReader() Grid.databind() Cn.close() End Sub Sub Grid_Editar(s as Object,e as DatagridCommandEventArgs) Grid.EditItemIndex=e.Item.ItemIndex EnlaceGrid End Sub Sub Grid_Update(s as Object,e as DatagridCommandEventArgs) Dim vCod_Cli as String Dim txtNombre as Textbox Dim txtDireccion as Textbox Dim txtRuc as Textbox Dim vNombre as String Dim vDireccion as String Dim vRuc as String vCod_Cli=Grid.DataKeys(e.Item.ItemIndex) txtNombre=e.Item.Cells(1).Controls(0) txtDireccion=e.Item.Cells(2).Controls(0) txRuc=e.Item.Cells(3).Controls(0) vNombre=txtNombre.text vDireccion=txtDireccion.text vRuc=txtRuc.text StrSql="Update clientes set cli_nombre=@Nombre,Cli_direccion=@direccion,Cli_ruc=@Ruc where Cli_codigo=@codigo" cmd=new SqlCommand(StrSql,Cn) cmd.parameters.add("@Nombre",vNombre) cmd.parameters.add("@direccion",vDireccion) cmd.parameters.add("@ruc",Cdbl(vRuc)) cmd.Parameters.add("@codigo",vCod_Cli) Cn.open() Cmd.executeNonQuery() Cn.Close() Cmd.Dispose() Grid.EditItemIndex=-1 EnlaceGrid End Sub Sub Grid_Cancel(s as Object,e as DatagridCommandEventArgs) Grid.EditItemIndex=-1 EnlaceGrid End Sub Sub Grid_Delete(s as Object,e as DatagridCommandEventArgs) Dim vCodigo as String vCodigo=Grid.DataKeys(e.item.ItemIndex)
I.S.T.Idat 48 ASP.NET

Aplicaciones Web

cmd=new SqlCommand("Delete From Clientes Where cli_Codigo=@codigo",Cn) cmd.parameters.add("@codigo",vCodigo) Cn.open() Cmd.executeNonQuery() Cn.close() Grid.EditItemIndex=-1 EnlaceGrid End Sub public Sub MNuevo(sender As Object, e As System.EventArgs) Cmd=New SqlCommand("Select Count(*) From Clientes",Cn) Cn.Open() Dim xValor as Integer xValor=Cmd.ExecuteScalar() Cn.Close() txtCod.text="":txtNom.text="":txtFec.text="":txtdir.text="" txtCod.text="C"+Right("0000"+ Trim(Str(xValor+1)),4) End Sub public Sub MGrabar(sender As Object, e As System.EventArgs) StrSql="Insert Into Clientes (cli_codigo,cli_nombre,cli_direccion,cli_ruc) values(@cod_cli,@nom_cli,@direccion,@ruc)" cmd=New SqlCommand(StrSql,Cn) cmd.parameters.add("@cod_cli",txtCod.text) cmd.parameters.add("@nom_cli",txtNom.text) cmd.parameters.add("@direccion",txtDir.text) cmd.parameters.add("@ruc",txtFec.text) cn.open() cmd.executeNonQuery() cn.close() txtCod.text="":txtNom.text="":txtFec.text="":txtdir.text="" EnlaceGrid End Sub </SCRIPT> </HEAD> <body> <FORM id="Form1" method="post" runat="server"> <TABLE border="1" height="154"> <TR> <TD align="right" width="35">Codigo:</TD> <TD><asp:textbox id="txtCod" Runat="server"> txtCod</asp:textbox></TD> </TR> <TR> <TD align="right" width="35">Nombre:</TD> <TD><asp:textbox id="txtNom" Runat="server" Width="303px">Txtnom</asp:textbox></TD> </TR> <TR>
I.S.T.Idat 49 ASP.NET

Aplicaciones Web

<TD align="right" width="35">Direccion:</TD> <TD><asp:textbox id="txtDir" Runat="server" Width="285px">Txtdireccion</asp:textbox></TD> </TR> <TR> <TD align="right" width="35">Ruc</TD> <TD><asp:textbox id="txtFec" Runat="server"></asp:textbox></TD> </TR> <TR> <TD width="35"></TD> <TD><asp:button id="BtnNuevo" onclick="MNuevo" Runat="server" text="Nuevo"></asp:button><asp:button id="BtnGrabar" onclick="MGrabar" Runat="server" Text="Grabar"></asp:button></TD> </TR> Estas lineas agrege para </TABLE> asignar los eventos <P> <asp:datagrid id="Grid" Runat="server" OnEditCommand="Grid_Editar" OnUpdateCommand="Grid_Update" OnDeleteCommand="Grid_Delete" OnCancelCommand="Grid_Cancel" DataKeyField="Cli_codigo" CellPadding="10" HeaderStyle-BackColor="#6666ff" AutoGenerateColumns="False" Font-Bold="True"> <HeaderStyle ForeColor="Black" BackColor="WhiteSmoke"></HeaderStyle> <Columns> <asp:BoundColumn DataField="cli_Codigo" ReadOnly="True" HeaderText="CODIGO"></asp:BoundColumn> <asp:BoundColumn DataField="cli_nombre" HeaderText="Nombres y Apellidos"></asp:BoundColumn> <asp:BoundColumn DataField="cli_ruc" HeaderText="Ruc"></asp:BoundColumn> <asp:ButtonColumn Text="Eliminar" HeaderText="Borrar" CommandName="Delete"></asp:ButtonColumn> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Actualizar" HeaderText="Modificar" CancelText="Cancelar" EditText="Editar"></asp:EditCommandColumn> </Columns> </asp:datagrid></P> </FORM> </body> </HTML>

I.S.T.Idat

50

ASP.NET

Aplicaciones Web

CRYSTAL REPORTS Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se escribe para controlar un tipo de base de datos especfico o la tecnologa de acceso a bases de datos. Modelos de extraccin e insercin Con el fin de ofrecer el acceso a datos ms flexible para los programadores, los controladores de base de datos de Crystal Reports se han diseado para proporcionar un modelo de extraccin e insercin de acceso a datos. Modelo de extraccin

En un modelo de extraccin, el controlador se conectar a la base de datos y extraer datos cuando se necesiten. Con este modelo, Crystal Reports controla tanto la conexin a la base de datos como el comando SQL que se ejecuta para obtener los datos y no necesita ninguna codificacin del programador. Si no se escribe ningn cdigo especial en tiempo de ejecucin, se utiliza el modelo de extraccin. Modelo de insercin

En comparacin, el modelo de insercin necesita que el programador escriba cdigo para conectarse a la base de datos, ejecutando un comando SQL para crear un conjunto de registros o de datos que se ajusten a los campos del informe y enviando ese objeto al informe. Este mtodo le permite crear recursos compartidos de conexin en la aplicacin y filtrar los datos antes de que Crystal Reports los reciba. Los controladores de bases de datos se utilizan durante el tiempo de creacin y de procesamiento. Durante el tiempo de creacin, el controlador de la base de datos se utiliza para identificar el esquema de los datos. Con los controladores OLEDB, ODBC y Access/Excel, este proceso implica

I.S.T.Idat

51

ASP.NET

Aplicaciones Web

la conexin a una base de datos y la seleccin de las tablas, vistas o

procedimientos

almacenados para especificar el esquema. Con los controladores ADO.NET y de definicin de campos, este proceso implica la seleccin de un esquema con la forma de un archivo XML (*.xml) o de un archivo de definicin de datos (*.ttx). Durante el tiempo de procesamiento, el informe utilizar el mismo controlador de base de datos utilizado para crear el informe. No obstante, si los datos se insertan en el informe, el informe seleccionar el controlador adecuado para controlar el conjunto de registros o el conjunto de datos.

Controladores de bases de datos con Crystal Reports para Visual Studio .NET Controlador de Base de datos a las que se Mtodo de acceso a datos base de datos tiene acceso OLEDB Cualquier base de datos que Admite tanto la extraccin de tenga un proveedor OLEDB. datos de la base de datos como la insercin de datos en el informe de un conjunto de registros ADO. ODBC Cualquier base de datos que Admite tanto la extraccin de tenga un proveedor ODBC. datos de la base de datos como la insercin de datos en el informe de un conjunto de registros RDO. Access/Excel Bases de datos de Microsoft Admite tanto la extraccin de Access y libros de Microsoft datos de la base de datos como Excel. la insercin de datos en el informe de un conjunto de registros DAO. ADO.NET Cualquier base de datos con Admite la insercin de datos en un proveedor gestionado. el informe desde un conjunto de datos ADO.NET. Este controlador no extraer datos por s mismo. Ninguna. El controlador se incluye principalmente para la Este controlador especial se compatibilidad con versiones anteriores y slo se utiliza utiliza para crear informes durante el proceso de creacin basados nicamente en un de informes. esquema sin datos reales. En tiempo de ejecucin, debe enviarse un conjunto de
I.S.T.Idat 52 ASP.NET

Definicin de campo

Aplicaciones Web

Objeto de datos Crystal (CDO)

Ninguna. Este controlador especial obtiene acceso a datos que no residen en una base de datos tradicional.

registros o un conjunto de datos a un informe creado con el controlador. Este controlador se incluye principalmente para la compatibilidad con versiones anteriores. Este controlador slo admite la insercin de datos en un informe desde un conjunto de registros CDO; no extraer datos por s mismo. Utilice la biblioteca de objetos de datos Crystal para llenar un conjunto de registros CDO. Nota Este controlador no est disponible durante el perodo de creacin del informe. Seleccione uno de los controladores disponibles para crearlo.

Crear un reporte Independientemente de cmo se har la presentacin, el reporte se define en un archivo ".RPT", que forma parte de su proyecto. Ese archivo especifica el modo en que se har la presentacin del reporte, pero no incluye los datos propiamente dichos. Los datos se definirn en el tiempo de ejecucin. Crystal Reports se basa en un concepto muy comn de la definicin de reportes: los reportes se componen de "secciones", y cada seccin es un espacio horizontal en la pgina. Existen diversos tipos de secciones, por ejemplo: Encabezado del reporte, aparece en la primera pgina. Encabezado de pgina, aparece en la parte superior de todas las pginas.

I.S.T.Idat

53

ASP.NET

Aplicaciones Web

Detalle: lo ms importante. En el tiempo de ejecucin, se genera una de estas secciones para cada lnea (registro) en la base de datos. Pie de pgina, aparece en la parte inferior de todas las pginas. Pie de reporte, aparece al final del reporte.

En un principio, todos los reportes presentan estas cinco secciones. Otras secciones son opcionales, como por ejemplo: Encabezado de grupo, aparece antes de un grupo. Pie de grupo, aparece al final del grupo.

Se podr omitir una o ms secciones, en caso de que no sean necesarias. Acceder a la base de datos Antes de crear el reporte, hay que decidir cul ser el mecanismo utilizado para acceder a la base de datos. Crystal Reports puede obtener datos de una infinidad de fuentes, pero una buena cantidad de ellas, como DAO, ADO y OLE/DB, no est "administrada", o sea, es cdigo.NET "puro". En una aplicacin.NET, probablemente sea deseable realizar el acceso a travs de ADO.NET. Para ello, lo ms fcil es definir un Conjunto de datos tipificado, aun antes de crear el reporte. Un Reporte Sencillo en ASP Net Creamos una Aplicacin Web ASP .Net Nueva, para el ejemplo WebAPLIR1

I.S.T.Idat

54

ASP.NET

Aplicaciones Web

Agregamos un nuevo elemento, y seleccionamos Crystal Report, para el ejemplo RepProductos.rpt

I.S.T.Idat

55

ASP.NET

Aplicaciones Web en la ventana del Asistente del Registro del Producto, presionamos despus, luego nos muestra la siguiente ventana:

Asistente de Informes Estandar

En la ventana de Asistente de informe estndar, nos ubicamos en OLE DB (ADO) y seleccionamos un proveedor adecuado, en este caso: Microsoft OLE DB Provider for SQL Server

I.S.T.Idat

56

ASP.NET

Aplicaciones Web

Presionamos siguiente y debemos configurar la siguiente ventana

Y presionamos Finalizar.

I.S.T.Idat

57

ASP.NET

Aplicaciones Web

Luego Expandimos OLE DB (ADO) hasta ubicar la tabla que utilizaremos para el reporte, para el ejemplo la tabla Products y presionamos Insertar Tabla

Presionamos siguiente y ahora debemos configurar los campos que deseamos mostrar en el informe

I.S.T.Idat

58

ASP.NET

Aplicaciones Web

Y para este ejemplo presionamos Finalizar, el cual nos mostrara el diseo del informe creado por el asistente de Crystal Report

I.S.T.Idat

59

ASP.NET

Aplicaciones Web

Luego en el formulario Web agregamos el Control Web: CrystalReportViewer, y le damos en su propiedad ID el nombre CrVProductos Finalmente ingresamos al cdigo del programa y digitamos lo siguiente:

Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load With CrVProductos 'Establecemos como su origen al reporte creado anteriormente .ReportSource = Server.MapPath("RepProductos.rpt") .DataBind() End With End Sub
Quedando el informe como la ventana siguiente:

I.S.T.Idat

60

ASP.NET

Aplicaciones Web

Ahora para poder darle un poco mas de dinamismo al Reporte, vamos a filtrar segn una categora, para esto debemos agregar un control DropDownList y lo colocaremos antes del CrystalReportViewer y le daremos el nombre (ID) ddlcategorias y en su propiedad AutoPostBack lo establecemos en True, quedando la pantalla en modo de diseo de la siguiente manera:

Control DropdownList

Propiedad ID AutoPostBack

Valor ddlcategorias True CrVProductos False

CrystalReportViewer

ID DisplayGroupTree

I.S.T.Idat

61

ASP.NET

Aplicaciones Web

Finalmente el cdigo para que funcione el filtro de productos por categora seria: Imports System.Data.Sqlclient Public Class WebForm1 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not Page.IsPostBack Then CrVProductos.Visible = False Cargar_Categorias() EnlaceReporte() End If End Sub Private Sub EnlaceReporte() With CrVProductos .ReportSource = Server.MapPath("RepProductos.rpt") .DataBind() End With End Sub Private Sub Cargar_Categorias() Dim odst As New DataSet() Dim ocn As New SqlConnection("uid=sa;server=(local);database=northwind") Dim odap As New SqlDataAdapter("select * from categories", ocn) odap.Fill(odst) With ddlcategorias .DataTextField = "categoryname" .DataValueField = "categoryid" .DataSource = odst .DataBind() End With End Sub Private Sub ddlcategorias_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ddlcategorias.SelectedIndexChanged 'Capturamos el valor del codigo de la categoria Dim id As Integer = CInt(ddlcategorias.SelectedItem.Value) Dim StrFormula As String CrVProductos.Visible = True 'Filtramos los registros por el campo Codigo de Categora, respetando la sintaxis 'de Cristal Report {Tabla.Campo}=Valor StrFormula = "{Products.categoryid}=" & id 'Asignando nuestra formula
I.S.T.Idat 62 ASP.NET

Aplicaciones Web

CrVProductos.SelectionFormula = StrFormula 'Volviendo a enlazar el origen de datos del reporte EnlaceReporte() End Sub End Class Finalmente el Reporte en ejecucin al seleccionar una Categora quedaria:

Web service Los servicios Web XML se componen de dos partes: el punto de entrada al servicio Web XML y el cdigo que implementa la funcionalidad del servicio Web XML. En ASP.NET, el archivo .asmx es un archivo de texto que sirve de punto de entrada direccionable del servicio Web XML. Hace referencia al cdigo de ensamblados precompilados, a un archivo de cdigo subyacente o a un cdigo contenido en el propio archivo .asmx. Nota Si el cdigo est contenido directamente en el archivo .asmx, ASP.NET lo compilar bajo peticin en el servidor. La directiva de procesamiento WebService situada en la parte superior del archivo .asmx determina dnde se buscar la implementacin del servicio Web XML. De forma predeterminada, Visual Studio utiliza archivos de cdigo en segundo plano, como Service1.asmx.vb o Service1.asmx.cs, cuando se crea un servicio Web XML con la plantilla de proyecto de servicio Web ASP.NET.

I.S.T.Idat

63

ASP.NET

Aplicaciones Web El atributo WebMethod se asocia a un mtodo Public para indicar que se desea exponer dicho mtodo como parte del servicio Web XML. Tambin se pueden utilizar las propiedades de este atributo para configurar an ms el comportamiento del mtodo de servicio Web XML.

Clase System.Web.Services.WebService La clase System.Web.Services.WebService, que define la clase base opcional de los servicios Web XML, proporciona acceso directo a los objetos ASP.NET comunes, como los destinados a estados de aplicacin y de sesin. De forma predeterminada, los servicios Web XML creados en cdigo administrado con Visual Studio se heredan de esta clase. El servicio Web XML se puede heredar de esta clase para obtener acceso a objetos intrnsecos de ASP.NET, como Request y Session.

I.S.T.Idat

64

ASP.NET

Aplicaciones Web Aplicacin .- Empleando la BDD universidad, realizar la siguiente consulta.-

Controles: RequiredFieldValidator Convierte el control de entrada asociado en un campo obligatorio. Propiedades Controltovalidate: Textbox1 (enlzar con el campo textbox1 del codigo) ErrorMessage: Campo Obligatorio ValidationSummary Muestra un resumen de todos los errores de validacin en lnea en una pgina Web, en un cuadro de mensaje o en ambos. Resultado Final:

Pasos para crear la aplicacin Paso 1.- Elaborar los store procedure: a)Para buscar el nombre del alumno y su especialidad a la que pertenece

I.S.T.Idat

65

ASP.NET

Aplicaciones Web

Create procedure sp_datos @cod as char(5) as select Nombre=Apealumno+', '+Nomalumno, Nomesp from alumno a inner join especialidad e on e.idesp=a.idesp where idalumno=@cod b) para ver sus notas Create procedure sp_nota @cod char(5) as select c.Idcurso,Nomcurso,Exaparcial,exaFinal promedio=str((exaparcial+2*exafinal )/3,4,1) from notas n inner join curso c on c.idcurso=n.idcurso where idalumno=@cod paso 2.- Elegir nuevo proyecto : (sevivio web Asp)

I.S.T.Idat

66

ASP.NET

Aplicaciones Web

Paso 3.- Codificar los metodos.


Autor Alberto Moreno

Imports System.Web.Services Imports System.Data.OleDb <WebService(Namespace := "http://tempuri.org/")> _ Public Class Service2 Inherits System.Web.Services.WebService Dim Cn As New OleDbConnection("Provider=SqlOledb;Uid=sa;Database=Universidad;Server=(loc al)") Dim Cmd As New OleDbCommand() Dim Pm As OleDbParameter + Cdigo generado por el Diseador de servicios Web " ' EJEMPLO DE SERVICIO WEB ' El servicio de ejemplo HelloWorld() devuelve la cadena Hello World. ' Para generar, quite los comentarios de las siguientes lneas y, a continuacin, guarde y genere el proyecto. ' Para probar este servicio Web, compruebe que la pgina de inicio es el archivo .asmx ' y pulse F5. ' '<WebMethod()> Public Function HelloWorld() As String ' HelloWorld = "Hello World" ' End Function <WebMethod()> Public Function verNotas(ByVal cod As String) As DataSet Cn.Open() With Cmd .Connection = Cn .CommandType = CommandType.StoredProcedure .CommandText = "sp_nota" End With Pm = Cmd.Parameters.Add("@cod", OleDbType.Char, 5) Pm.Direction = ParameterDirection.Input Pm.Value = cod Dim da As New OleDbDataAdapter(Cmd) Dim ds As New DataSet() da.Fill(ds) Return ds da.Dispose() Cmd.Dispose() Cn.Dispose() End Function

I.S.T.Idat

67

ASP.NET

Aplicaciones Web

<WebMethod()> Public Function promedio(ByVal ds As DataSet, ByVal ncol As Byte) As Single Dim sm, pro As Single Dim can, f As Integer sm = 0 can = ds.Tables(0).DefaultView.Count For f = 0 To ds.Tables(0).DefaultView.Count - 1 sm += ds.Tables(0).Rows(f).Item(ncol) Next If can > 0 Then pro = Math.Round(sm / can, 1) Else pro = 0 End If Return (pro) End Function <WebMethod()> Public Function Datos(ByVal cod As String) As DataSet Cn.Open() With Cmd .Connection = Cn .CommandType = CommandType.StoredProcedure .CommandText = "sp_datos" End With Pm = Cmd.Parameters.Add("@cod", OleDbType.Char, 5) Pm.Direction = ParameterDirection.Input Pm.Value = cod Dim da As New OleDbDataAdapter(Cmd) Dim ds As New DataSet() da.Fill(ds) Return ds da.Dispose() dispose Libera los recursos utilizados por Component. Cmd.Dispose() Cn.Dispose() End Function <WebMethod()> Public Function veresp() As DataSet cn.Open() With cmd .Connection = cn .CommandType = CommandType.StoredProcedure .CommandText = "sp_especialidad" End With Dim da As New OleDbDataAdapter(cmd) Dim ds As New DataSet() da.Fill(ds) Return ds da.Dispose() cmd.Dispose()
I.S.T.Idat 68 ASP.NET

Aplicaciones Web

cn.Dispose() End Function End Class Paso 4.- Generar el Webser_notas o tambien pulsando F5

Paso 5.- del menu Archivo Agregar proyecto Nuevo proyecto El explorador de Windows agregando y cambiando al proyecto web_asp

Hacer Clic derecho en References Agregar Referencia Web Y copiar la direccin anterior: Como se muestra en la siguiente figura. Paso 6.- Agregar los formularios de trabajo , por ejemplo WebForm1 es el diseo de la boleta de nota donde se hace referencia al Web_service , Webalumnos.- Para el mantenimiento de la tabla alumnos.

I.S.T.Idat

69

ASP.NET

Aplicaciones Web La codificacin en el formulario 1 Webform1

Public Class WebForm1 Inherits System.Web.UI.Page Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label2 As System.Web.UI.WebControls.Label Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox Protected WithEvents Label3 As System.Web.UI.WebControls.Label Protected WithEvents Label5 As System.Web.UI.WebControls.Label Protected WithEvents Label7 As System.Web.UI.WebControls.Label Protected WithEvents btnok As System.Web.UI.WebControls.Button Protected WithEvents lbmen As System.Web.UI.WebControls.Label Protected WithEvents lbnom As System.Web.UI.WebControls.Label Protected WithEvents lbesp As System.Web.UI.WebControls.Label Protected WithEvents DgNota As System.Web.UI.WebControls.DataGrid Protected WithEvents ValidationSummary1 As System.Web.UI.WebControls.ValidationSummary Protected WithEvents RequiredFieldValidator1 As System.Web.UI.WebControls.RequiredFieldValidator Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink Protected WithEvents lbpro As System.Web.UI.WebControls.Label + Cdigo generado por el Diseador de Web Forms Dim servicio As New localhost.Service2() Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina End Sub Private Sub btnok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnok.Click Dim ds As New DataSet() Dim ds2 As New DataSet() Dim fila As DataRow Dim canr As Integer Dim cod As String Dim pro As Single cod = TextBox1.Text ds = servicio.Datos(cod) canr = ds.Tables(0).DefaultView.Count ds2 = servicio.verNotas(cod) DgNota.DataSource = ds2 DgNota.DataBind() If canr = 0 Then lbnom.Text = "" lbesp.Text = "" lbmen.Text = "codigo no existe "

I.S.T.Idat

70

ASP.NET

Aplicaciones Web

lbpro.Text = "" Exit Sub End If lbmen.Text = "" lbnom.Text = ds.Tables(0).Rows(0).Item(0) lbesp.Text = ds.Tables(0).Rows(0).Item(1) pro = servicio.promedio(ds2, 4) lbpro.Text = pro.ToString If pro > 10.5 Then lbpro.ForeColor = System.Drawing.Color.Blue Else lbpro.ForeColor = System.Drawing.Color.Red End If End Sub End Class
Aplicacin 2.- seleccionando en un combo DropDwonList1 una especialidad llenado desde un servicio , que muestre todos los alumnos de es aespecialidad.

DropDownList1.En propiedades establecer AutopostBack =True true si se produce una devolucin de exposicin automtica cundo el usuario cambia la seleccin de la lista; de lo contrario, false. Dgalumno (Dtagrid) Lbnro la Etiqueta

Codificacin Imports System.Data.OleDb Public Class webalumnos Inherits System.Web.UI.Page Protected WithEvents DropDownList1 As System.Web.UI.WebControls.DropDownList Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents DgAlumno As System.Web.UI.WebControls.DataGrid

I.S.T.Idat

71

ASP.NET

Aplicaciones Web

Protected WithEvents Label4 As System.Web.UI.WebControls.Label Protected WithEvents Lbnro As System.Web.UI.WebControls.Label Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink Protected WithEvents Label2 As System.Web.UI.WebControls.Label +" Cdigo generado por el Diseador de Web Forms " Dim cn As New OleDbConnection("provider=sqloledb; uid=sa;database=universidad; server=(local)") Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then listar1() End If Si la pagina no ha sido cargada

End Sub Sub listar1() Dim servicio As New localhost.Service2() Dim ds As New DataSet() ds = servicio.veresp DropDownList1.DataSource = ds DropDownList1.DataTextField = "nomesp" DropDownList1.DataValueField = "idesp" DropDownList1.DataBind() End Sub Sub listar2() Dim code As String code = DropDownList1.SelectedItem.Value Dim Sql As String = "select Idalumno, Nombre=apealumno+', '+nomalumno,proce from alumno where idesp='" + code + "'" Dim cmd As New OleDbCommand(Sql, cn) cmd.Connection.Open() Dim oreader As OleDbDataReader = cmd.ExecuteReader DgAlumno.DataSource = oreader DgAlumno.DataBind() Lbnro.Text = DgAlumno.Items.Count cmd.Dispose() End Sub Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged listar2() End Sub End Class

I.S.T.Idat

72

ASP.NET

Aplicaciones Web

Aplicacion2.-

Servicios Web Northwind (Tabla Products - Categories) Creamos un Proyecto de Tipo Visual Basic con la plantilla Servicio Web ASP .NET y le damos el nombre de WSNorthwind

En el Explorador de Soluciones, seleccionamos el archivo Service1.asmx y lo renombramos a: Northwind.asmx Luego debemos ingresar al cdigo de este archivo y en la primera lnea debemos agregar la clsica cadena que nos permita utilizar al proveedor de datos Sqlclient. Imports System.Data.SqlClient Imports System.Web.Services No olvidar cambiar el nombre de la clase Service1 por Servicio_Northwind <WebService(Namespace := "http://tempuri.org/")> _ Public Class Servicio_Northwind Inherits System.Web.Services.WebService

I.S.T.Idat

73

ASP.NET

Aplicaciones Web

Luego debemos escribir el cdigo que nos permita crear funciones y que nos devolvera los registros necesarios. Dim oCn As New SqlConnection(Conexion) Dim odst As DataSet = Nothing Private Function Conexion() As String Conexion = "uid=sa;server=(local);database=northwind" End Function <WebMethod(Description:="Listado de Productos")> _ Public Function Listar_Productos() As DataSet Creamos un Obj. DataAdapter que liste todos los productos Dim odap As New SqlDataAdapter( _ "select productid,productname,unitprice,categoryid " & _ " from products order by productname", ocn) odst = New DataSet() Llenamos el Obj. Dataset, con el resultado de las filas del DataAdapter odap.Fill(odst) Devolvemos el Obj. Dataset Return odst End Function <WebMethod(Description:="Listado de Productos por Categoria")> _ Public Function Listar_Prod_x_Categoria(ByVal codcat As Integer) As DataSet Creamos un Obj. DataAdapter que liste todos los productos que pertenezcan al codigo de categoria enviado como parmetro Dim odap As New SqlDataAdapter( _ "select productid,productname,unitprice,categoryid " & _ " from products where categoryid=@codigo order by productname", ocn) Creando el parmetro que utiliza la consulta SELECT del Obj. DataAdapter odap.SelectCommand.Parameters.Add("@codigo", SqlDbType.Int).Value = codcat odst = New DataSet() Llenamos el Obj. Dataset, con el resultado de las filas del DataAdapter odap.Fill(odst) Return odst
I.S.T.Idat 74 ASP.NET

Aplicaciones Web

End Function <WebMethod(Description:="Listado de Categorias")> _ Public Function Listar_Categorias() As DataSet Creando un Obj. SQlCommand que va a utilizar un Procedimiento Almacenado Dim ocmd As New SqlCommand("usp_lst_categorias", ocn) ocmd.CommandType = CommandType.StoredProcedure ocn.Open() Dim odap As New SqlDataAdapter(ocmd) odst = New DataSet() odap.Fill(odst, "categorias") ocn.Close() Return odst End Function Luego para probar si el servicio web esta funcionando debemos seleccionar el servicio en el explorador de soluciones (WSNorthwind.asmx) y clic derecho Generar y examinar. En donde podemos probar individualmente cada funcin el cual nos devuelve de acuerdo a los valores enviados un archivo en formato XML Luego al final debemos ejecutar la aplicacin (F5), el cual nos muestra la misma pantalla anterior solo que lo muestra en una pagina web:

I.S.T.Idat

75

ASP.NET

Aplicaciones Web

Lo importante aqu es la direccin URL, desde donde carga este servicio web, que para el ejemplo es: http://localhost/WSNorthwind/Northwind.asmx

Finalmente debemos probar este servicio desde un cliente, el cual puede ser una Aplicacin Windows o una Aplicacin Web Aplicacin Web Creamos un nuevo Proyecto de Visual Basic de tipo de plantilla Aplicacin Web ASP NET y le damos el nombre de: ClienteASPNet_WSNorthwind

I.S.T.Idat

76

ASP.NET

Aplicaciones Web

Luego al formulario web le damos el nombre de WebCliente.aspx y su diseo ser parecido a:

Luego sobre el explorador de soluciones, ubicamos la carpeta REFERENCES y hacemos clic derecho y seleccionamos la opcin Agregar Referencia Web , en el cual ingresaremos la cadena URL del Servicio Web Anterior (WSNorthwind) en el texto de Direccin, y presionamos el botn que tiene el smbolo de la flecha (color verde), si encuentra el servicio este aparecer en la columna de la

I.S.T.Idat

77

ASP.NET

Aplicaciones Web

izquierda todos los mtodos web declarados, para lo cual lo nico que necesitaremos es presionar el botn Agregar referencia

Ahora solo quedara ingresar el cdigo respectivo, no olvidar verificar las siguientes propiedades: Control Propiedad DropDownListBox1 ID AutoPostBack Label1 Label2 Datagrid1 Text ID ID Valor ddlcategorias True Categories lblcat dgdproductos

No olvidar darle un formato al Datagrid, para lo cual puede utilizar el formato Automtico (clic derecho sobre el datagrid), as como tambin establecer una paginacin adecuada (clic derecho sobre el datagrid y escoger Generador de Propiedades y ubicarse en la ficha Paginacin), para el ejemplo se ha escogido Permitir paginacin, Tamao de Pagina: 5, en Posicin: Superior e Inferior, en Modo: nmeros de Pagina

I.S.T.Idat

78

ASP.NET

Aplicaciones Web

Codigo del formulario Web Dim obj As New localhost.Servicio_Northwind() Dim odst As New DataSet() Dim xcat As Int16 Private Sub dgdproductos_PageIndexChanged(ByVal source As Object, _ ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) _ Handles dgdproductos.PageIndexChanged dgdproductos.CurrentPageIndex = e.NewPageIndex Cargar_Productos(xcat) End Sub Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aqu el cdigo de usuario para inicializar la pgina 'Si la pagina se esta cargando por primera vez el codigo categora es cero If Not Page.IsPostBack Then Call Cargar_Categorias() xcat = 0 Else 'SI NO se recupera el codigo desde una variable de session xcat = CInt(Session("codcat")) End If 'Establecemos la primera pagina como activa del datagrid dgdproductos.CurrentPageIndex = 0 lblcat.Text = xcat 'llamamos al procedimiento que nos mostrara los productos de acuerdo a la categora seleccionada Call Cargar_Productos(xcat) End Sub Sub Cargar_Categorias() 'Obteniendo el listado de categoras a travs del servicio web odst = obj.Listar_Categorias 'Estableciendo las propiedades para el dropdownlist de las categorias With ddlcategorias .DataSource = odst.Tables(0).DefaultView .DataTextField = "categoryname" .DataValueField = "categoryid" .DataBind() End With
I.S.T.Idat 79 ASP.NET

Aplicaciones Web

End Sub Sub Cargar_Productos(ByVal cat As Integer = 0) 'si no se ha seleccionado ninguna categora que liste todos los productos If cat = 0 Then odst = obj.Listar_Productos Else 'SI NO Listar solo los que pertenezcan a la categora seleccionada odst = obj.Listar_Prod_x_Categoria(xcat) End If 'Enlazar el dataset con el Datagrid dgdproductos.DataSource = odst.Tables(0).DefaultView dgdproductos.DataBind() End Sub Private Sub ddlcategorias_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ddlcategorias.SelectedIndexChanged 'Obteniendo el codigo de categora del objeto ddlcategorias xcat = CInt(ddlcategorias.SelectedItem.Value) lblcat.Text = xcat.ToString 'Almacenando el codigo de categora en la variable de session Session("codcat") = xcat Cargar_Productos(xcat) End Sub

I.S.T.Idat

80

ASP.NET

Aplicaciones Web

Script Utilizado Create Proc usp_lst_categorias As Select * From categories Order By categoryname Go Exec usp_lst_categorias Go

ALGUNOS TRUCOS EN ASP .NET


Esta nota se centrar en responder algunas de las preguntas ms frecuentes que surgen al momento de comenzar a trabajar con ASP .NET.

I.S.T.Idat

81

ASP.NET

Aplicaciones Web No se harn grandes explicaciones tcnicas, sino ms bien, mostraremos cdigo para resolver algunos de los problemas ms comunes con los que nos encontramos al momento de escribir una aplicacin, por ejemplo, cmo enviar un mensaje, cmo subir un archivo, cmo escribir en el Visor de Eventos o cmo escribir un contador de Performance. As que vamos directamente a los temas: Cmo enviar correo electrnico por medio de ASP .NET? En el namespace System.Web.Mail encontramos la clase necesaria para el envo de mail. Esta clase usa el objeto CDOSYS que viene en Windows 2000, en reemplazo del antiguo CDONTS que venia con WinNT 4. En el siguiente ejemplo, en el evento Load de una pgina ASP.NET realizamos en envo del correo: ' Importamos el namespace Imports System.Web.Mail Public Class EnviarMail Inherits System.Web.UI.Page Protected WithEvents Label1 As System.Web.UI.WebControls.Label Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load En la siguiente lnea creamos el objeto mensaje: Dim Mensaje As New MailMessage() Adems, como tambin interesa enviar un archivo adjunto al mensaje, creamos un "attach". En esta clase el constructor tiene dos posibilidades, una de ellas como en el ejemplo, es simplemente agregar el nombre del archivo, la otra opcin es incluir tambin el modo de encoding seleccionando el tipo con el numerador System.Web.Mail.MailEncoding. Dim oAttach As New Mail.MailAttachment(Server.MapPath("Archivo.zip")) Se agrega a continuacin a quien va dirigido el mensaje, el origen, el tema: Mensaje.To = "juanperez@dominio.com"

Mensaje.From = "msdnlatam@midominio.com" Mensaje.Subject = "Mensaje de Prueba"


En la lnea a continuacin se define el tipo del formato del cuerpo del mensaje, HTML o texto. Mensaje.BodyFormat = MailFormat.Html Mensaje.Body = "<html><body><h1>Este es un mensaje de prueba</h1>" _ & "</body></html>"

I.S.T.Idat

82

ASP.NET

Aplicaciones Web Se agrega el archivo adjunto a la lista de Attachments: Mensaje.Attachments.Add(oAttach) Y se enva el mensaje. SmtpMail.Send(Mensaje) Mensaje = Nothing oAttach = Nothing End Sub End Class Cmo subir un archivo con ASP.NET? En el namespace System.Web.UI.HtmlControls tenemos el control HtmlInputFile que cumple con las funcionalidades necesarias para poder subir un archivo ya sea de texto o binario. Este control trabaja con el tipo de codificacin multipart/form-data, veamos el ejemplo: La primera parte se compone de la pgina HTMl que se le presenta al usuario para que pueda seleccionar el archivo a subir. Se define el formulario con el atributo "enctype" correspondiente: <form id="Form1" method="post" enctype="multipart/form-data" runat="server"> Colocamos la etiqueta HTML que permita seleccionar el archivo: <INPUT id="File1" type="file" name="File1" runat="server" > <DIV>Seleccione el Archivo a Enviar:</DIV> <asp:Label id="Mensaje" runat="server" ></asp:Label> Y por ltimo el botn para confirmar el envo: <asp:Button id="cmdEnviar" runat="server" Text="Enviar"></asp:Button> </form> Esta segunda parte comprende el cdigo necesario para poder grabar el archivo enviado en el directorio correspondiente. 'Importamos System.IO Imports System.IO Public Class Upload Inherits System.Web.UI.Page Protected WithEvents Mensaje As System.Web.UI.WebControls.Label Protected WithEvents cmdEnviar As System.Web.UI.WebControls.Button Protected WithEvents File1 As System.Web.UI.HtmlControls.HtmlInputFile

I.S.T.Idat

83

ASP.NET

Aplicaciones Web Definimos el directorio destino del archivo de la siguiente manera, en el control File1, hay un objeto de la clase HTTPPostedFile que entre algunas de las propiedades que tiene es la del nombre del archivo: Private Sub cmdEnviar_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles cmdEnviar.Click Dim Destino As String = "E:\Inetpub\wwwroot\Upload\" & _ Path.GetFileName(File1.PostedFile.FileName) Como paso siguiente, con un simple paso, se graba el archivo en el destino definido. Es importante recordar de que el usuario que se este impersonando en ASP.NET (ya sea annimo u otro) tenga permiso para poder escribir en el directorio destino. File1.PostedFile.SaveAs(Destino) En el paso final, se coloca en una etiqueta la cantidad de bytes que contiene el archivo enviado. Mensaje.Text = "Su archivo ha sido cargado en : <b>" & Destino & _ "</b><br>Tamao: " & File1.PostedFile.ContentLength() & " bytes." End Sub Cmo escribir en el Visor de Eventos? Una de la problemtica ms comn, es la forma de como grabar informacin, ya sea de errores o descripciones de eventos, etc. En Windows se cuenta con una herramienta, el Visor de Eventos, que tiene varias caractersticas tiles como ser la posibilidad de hacer filtros por diferentes condiciones o exportar esa informacin para ser tratada por otra herramienta. Pero en general no se lo utiliza en los sistemas porque se mezcla con toda la informacin que genera el propio sistema operativo, entonces muchas veces resulta confuso poder encontrar la informacin que nos interesa. En este ejemplo veremos de qu forma podemos crear una nueva seccin en el Visor de Eventos y de que manera escribimos las diferentes entradas en ese log. Como primer paso, se verifica que si existe la seccin en el Visor de Eventos, en caso contrario es creada: 'Creo la entrada si no existe If Not System.Diagnostics.EventLog.SourceExists("MiFuente","NombreMaquina) Then System.Diagnostics.EventLog.CreateEventSource("MiFuente", "NombreDelLog", "NombreMaquina") End If

I.S.T.Idat

84

ASP.NET

Aplicaciones Web Importante: de acuerdo a la configuracin de seguridad definida en la aplicacin ASP.NET es probable que un usuario annimo o no tenga los permisos necesarios y no pueda ejecutar el cdigo necesario para crear la seccin en el Visor de Eventos o escribir en l. Es conveniente para crear la seccin impersonar un usuario que si tenga esos permisos. En este punto declaramos el objeto "log", definimos en que seccin escribimos: Dim Log As New System.Diagnostics.EventLog() Log.Source = NombreLog Y por ltimo escribimos los mensajes correspondientes, ya sean del tipo de error o del tipo de informacin. Log.WriteEntry("Este es un mensaje de Error", _ System.Diagnostics.EventLogEntryType.Error) Log.WriteEntry("Este es un mensaje de Aviso", _ System.Diagnostics.EventLogEntryType.Information) En mtodo WriteEntry permite diferentes alternativas, en este ejemplo hemos utilizado una de las mas simples, pero se pueden ingresar otros parmetros como: categora, Id del evento, etc. Para finalizar con este punto, tambin se puede decir que hay un mtodo

Log.Delete(NombreDeLog) que permite tambin borrar completamente una seccin en el Visor de Eventos. Cmo crear un contador de Performance? Una opcin muy interesante es la de poder crear contadores para el Monitor de Performance y actualizarlos de acuerdo a alguna particularidad que sea de inters. Por ejemplo, puede interesar ver la carga que tiene una determinada pgina o un determinado componente. En el ejemplo siguiente se vern cules son los pasos necesarios para realizar estas operaciones. El PerformanceCounter se encuentra en el namespace System.Diagnotics. Imports System.Diagnostics Public Class PerfMon Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load Definimos una variable del tipo PerfomanceCounter. Dim MiContador As PerformanceCounter Dim NombreContador As String = "Ejemplo"

I.S.T.Idat

85

ASP.NET

Aplicaciones Web Dim NombreCategoria As String = "DevDays" En el caso de que no exista la categora y el contador, se crean. En este punto se aplica lo explicado anteriormente en la parte del Visor de Eventos, en lo que respecta a la seguridad y los permisos que pueda tener el usuario de realizar esta operacin. Una alternativa es la de tener creado previamente el contador y la categora. 'Creo la Categora y el Contador If Not PerformanceCounterCategory.CounterExists(NombreContador, NombreCategoria) Then PerformanceCounterCategory.Create(NombreCategoria, "Descripcin de la categora", _ NombreContador, "Descripcin del Tipo de Contador") End If Se abre el contador de una determinada Categora, l ultimo parmetro (False), esta indicando que el contador es abierto en modo Lectura/Escritura. MiContador = New PerformanceCounter(NombreCategoria, NombreContador, False) Se incrementa el contador en 1. MiContador.IncrementBy(1) End Sub End Class En el caso que estamos presentando, el incremento se hace linealmente, por unidad, pero tambin esta la posibilidad con la propiedad CounterType, de poder definir que tipo de datos va a manejar el contador, como ser: porcentajes, promedios, tasas, multibase, inversiones, u otras. Para terminar, se han presentado algunos de los casos que ms preguntas generan, y tambin se puede observar de que manera el Framework .NET ha facilitado estas tareas que en casos anteriores eran complicadas de implementar y requera conocimientos profundos sobre el API de Windows.

CMO CREAR Y LEER CONTROLES DINMICAMENTE EN ASP .NET


En este artculo se muestra como crear controles dinmicamente, almacenarlos en contenedores de controles y posteriormente obtener la informacin que se ha ingresado en ellos. En el ejemplo de este artculo se utilizan los controles de uso tpico, cuando se lee informacin de una base de datos. Estos controles son, en la mayora de los casos, los botones radiales (RadioButton), cajas de seleccin (CheckBox), cajas de texto (TextBox) y las listas de seleccin (DropDownList).

I.S.T.Idat

86

ASP.NET

Aplicaciones Web Adems se utilizarn los elementos de una tabla ASPX, como son las filas (TableRow) y columnas (TableCell). Estas clases forman parte del Framework de .NET. Para el ejemplo se evita la codificacin directa en la pgina ASPX, realizndose en cdigo subyacente (codebehind) de la pgina ASPX creada. Mas informacin de cdigo subyacente se puede encontrar en el artculo E303247. Contenido

Cuando se necesita construir un editor de los valores almacenadas en una base de datos, especficamente en una tabla, la cantidad de registros contenidos en esta no es conocida de antemano. Por este mismo motivo, no se
puede disear una pgina con los controles creados con antelacin, sino que deben ser creados dinmicamente adecundose a las necesidades. Para el funcionamiento correcto, se utilizar la propiedad de almacenamiento de estado de los controles. Se podr encontrar ms informacin de sta propiedad en el documento Estado de los controles de ASP.NET: Al rescate de los programadores. Creacin de controles Los controles que se utilizarn en el ejemplo son los que tradicionalmente se encuentran en cualquier pgina html, como las cajas de texto, botones radiales, listas de seleccin y cajas de seleccin. Estos controles sern almacenados en otros controles que llamaremos contenedores. Muchos controles pueden comportarse como contenedores de otros controles, pero en el ejemplo se utilizar una tabla ASPX. Las clases que se utilizarn como contenedores son las siguientes Panel PlaceHolder Table con sus clases TableRow (fila) y TableCell (columna)

Al final del documento se encontrarn links a las definiciones de todos los controles utilizados en el ejercicio.
Representacin en html de los contenedores

I.S.T.Idat

87

ASP.NET

Aplicaciones Web El objeto Panel es representado en html como un elemento DIV. El PlaceHolder no tiene un representante en html, pero su contenido es transformado en html directamente. El objeto Table es una tabla html. El Panel y el PlaceHolder se comportan de manera similar, teniendo el primero una gran cantidad de propiedades para el formateo grfico, alineamiento, estilos, etc. Para el PlaceHolder, las nicas propiedades en tiempo de diseo son Visible y EnableViewState, ambas tambin disponibles para los otros contenedores. Funciones para agregar controles Los objetos Panel o PlaceHolder permiten un despliegue poco controlado de los controles agregados a estos ya que slo es posible definir el orden dentro del contenedor, pero no una posicin especfica en la pgina. Si se quiere un despliegue mas acabado, es recomendable la utilizacin de tablas, definiendo las filas y columnas donde sern agregados los controles. Para el Panel y el PlaceHolder, al momento de agregar un control a un contenedor, se utiliza la funcin Add de la coleccin de controles Controls. Los objetos objPanel y objPlaceHolder estn creados en la pgina en tiempo de diseo El objeto objControl, es cualquier tipo de control.

objPanel.Controls.Add(objControl) objPlaceHolder.Controls.Add(objControl) Adicionalmente a la funcin Add existe la funcin AddAt que permite agregar un control en alguna posicin en especial dentro del contenedor. objPanel.Controls.AddAt(intPos, objControl) objPlaceHolder.Controls.AddAt(intPos, objControl) Si se utiliza una tabla como contenedor de controles, el elemento apto para el almacenamiento es la celda. Por definicin, una tabla esta compuesta por una o muchas filas y cada fila esta compuesta por una o muchas celdas. La insercin de controles en una tabla se realiza a travs de la funcin Add de la coleccin de controles Controls de la celda.

I.S.T.Idat

88

ASP.NET

Aplicaciones Web El objeto objTable est creado en la pgina aspx en tiempo de diseo. El objeto objControl, es cualquier tipo de control

Dim objRow As TableRow Dim objCell As TableCell

objRow = New TableRow() Se crea una fila de la tabla objCell = New TableCell() Se crea una columna objCell.Controls.Add(objControl) Se le agrega el control a la celda objRow.Cells.Add(objCell) Se inserta la celda con el control en la fila creada anteriormente objTable.Rows.Add(objRow) Se inserta la fila en la tabla creada en la pgina Adicionalmente a la funcin Add existe la funcin AddAt que permite agregar un control en alguna posicin en especial dentro del contenedor. objCell.Controls.AddAt(intPos, objControl) En la prctica La aplicacin constar de dos formularios, el primero con controles de texto y listas de seleccin, y el segundo con botones radiales y cajas de seleccin. Para esto es necesario iniciar una aplicacin de tipo ASP.NET Web

Application.

I.S.T.Idat

89

ASP.NET

Aplicaciones Web

Una vez creada la aplicacin, se puede utilizar el archivo WebForm1.aspx creado inicialmente o generar otro con la opcin Add Web Form del men del proyecto.

I.S.T.Idat

90

ASP.NET

Aplicaciones Web

Primer Formulario En el primer formulario se permitir la edicin de los valores desde una tabla de categoras, permitiendo modificar el nombre de la categora y el acceso. El nombre se escribir en campos de texto y el tipo de acceso en listas de seleccin. Despus de ingresar los controles, la pantalla de pruebas quedar de la siguiente forma.

I.S.T.Idat

91

ASP.NET

Aplicaciones Web

Los controles creados en esta pgina son los siguientes: Tabla ASPX donde se almacenarn los controles dinmicos (representada por ###) Botn Jerarqua Botn Form.Keys Label de despliegue del resultado de la grabacin

Se utilizarn dos botones ya que se mostrarn dos formas de recorrer los controles de una pgina. La de jerarqua corresponde a la navegacin a travs de los controles anidados y la de las llaves (keys), de la coleccin request.form. Si bien no existe una jerarqua real de controles, estos se pueden recorrer como si as fuera, ya que dentro de la pgina hay un formulario, dentro del formulario estn la tabla aspx y los botones. A su vez, dentro de la tabla aspx existen las filas y dentro de cada fila estn las celdas. Por ltimo, en las celdas estn los controles de texto y listas de seleccin.

Creacin de los controles

I.S.T.Idat

92

ASP.NET

Aplicaciones Web En el evento Page_Load se cargan los controles dentro de la tabla. El cdigo para lograr esto se muestra en las siguientes secciones de cdigo, separadas por partes. A todo control que se quiera identificar despus de que el usuario presiona grabar, se le debe asignar una nombre para identificarlo. Esta propiedad es ID.

Primero se llena el encabezado de la tabla.


Dim objCell As TableCell Dim objRow As TableRow

objRow = New TableRow()

objCell = New TableCell() objCell.Text = "Id. categora" objRow.Cells.Add(objCell)

objCell = New TableCell() objCell.Text = "Nombre categora" objRow.Cells.Add(objCell)

objCell = New TableCell() objCell.Text = "Utilizacin" objRow.Cells.Add(objCell)

tblCategorias.Rows.Add(objRow) La tabla tblCategorias est creada en tiempo de diseo. En este cdigo, se crea el encabezado de sta. Primero se crea la fila de la tabla con la instruccin New TableRow(), despus se crea cada celda con la instruccin New TableCell() y se le asigna el texto a desplegar en la propiedad Text. Cuando la celda est lista, se inserta en la fila llamando a objRow.Cells.Add(objCell). El proceso se repite tres veces para las tres columnas del encabezado de la tabla. Al final, se inserta la fila en la tabla con la instruccin tblCategorias.Rows.Add(objRow). Para la creacin de las filas y columnas con la informacin, se utiliza un DataReader (almacenado en objRs) de una base de datos en Access. El ciclo que crea las dems filas y columnas es el siguiente: While objRs.Read

I.S.T.Idat

93

ASP.NET

Aplicaciones Web objTextBox = New TextBox() objTextBox.ID = "categ" & "-" & CStr(objRs("codigo")) objTextBox.Text = CStr(objRs("descripcion")) objTextBox.CssClass = "texto"

objDropDownList = New DropDownList() objDropDownList.Items.Add(New ListItem("Publica", "1")) objDropDownList.Items.Add(New ListItem("Privada", "2")) objDropDownList.Items.Add(New ListItem("Ambas", "3")) objDropDownList.ID = "acceso" & "-" & CStr(objRs("codigo"))

objRow = New TableRow() objCell = New TableCell() objCell.Text = CStr(objRs("codigo")) objRow.Cells.Add(objCell)

objCell = New TableCell() objCell.Controls.Add(objTextBox) objRow.Cells.Add(objCell)

objCell = New TableCell() objCell.Controls.Add(objDropDownList) objRow.Cells.Add(objCell)

tblCategorias.Rows.Add(objRow)

End While

La informacin extrada de la base de datos, est en tres columnas.

codigo : identifica a la categora


94 ASP.NET

I.S.T.Idat

Aplicaciones Web

descripcion : la descripcin misma de la categora acceso : el acceso a sta (privado, pblico y ambos)

La pgina que se construye es de la siguiente forma:

El cdigo de la categora es desplegado en la primera columna, el texto en la segunda y por ltimo, en la tercera se genera una lista de seleccin con las distintas opciones de acceso. En la base de datos, el valor almacenado del acceso es 1, 2 3 para las opciones Pblica, Privada o Ambas, respectivamente. Como se mencion antes, cuando el usuario presione grabar, es necesario identificar los controles individualmente. Por esta razn es importante asignar un nombre a cada uno. Para el ejemplo, a las cajas de texto se les asigna el nombre "categ-" & codigo, donde codigo es el cdigo de la categora en la base de datos. Para las listas de seleccin, el nombre asignado es "acceso-" & codigo. Si se observa el cdigo origen de la pgina HTML generada, se puede constatar el resultado de esto:

I.S.T.Idat

95

ASP.NET

Aplicaciones Web

Se sabe entonces que si se tienen N elementos en la base de datos, se crearn la misma cantidad de cajas de texto y listas de seleccin, con los nombres acceso-1 hasta acceso-N y categ-1 hasta categ-N. Lectura de los controles utilizando la jerarqua de navegacin. Al presionar el botn jerarqua, se graban los valores en la tabla, producindose el siguiente resultado:

I.S.T.Idat

96

ASP.NET

Aplicaciones Web

El cdigo del botn jerarqua es el siguiente:


Private Sub btnJerarquia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnJerarquia.Click Dim i As Integer Dim strNombre As String Dim lngCodigo As Long Dim objCeldaDescripcion As TableCell Dim objCeldaAcceso As TableCell Dim objDescripcion As TextBox Dim objAcceso As DropDownList Dim lngAcceso As Long

lblResultado.Text = "GRABADO UTILIZANDO NAVEGACION SOBRE CONTROLES<br><br>"

I.S.T.Idat

97

ASP.NET

Aplicaciones Web 'Las filas parten desde 0, pero como en la fila 0 est el texto de 'Id., Descripcin y Acceso, desde la nmero 1 ya estn los textboxs

For i = 1 To tblCategorias.Rows.Count 1 'la celda 0 es la del ID, la 1 la de la descripcin y la 2 del acceso objCeldaDescripcion = tblCategorias.Rows(i).Cells(1) objCeldaAcceso = tblCategorias.Rows(i).Cells(2)

'Se captura el primer control de cada celda, ya que ste es el de texto 'y el de acceso para cada columna de la tabla objDescripcion = objCeldaDescripcion.Controls(0) objAcceso = objCeldaAcceso.Controls(0)

If Left(objDescripcion.ID, 5) = "categ" Then strNombre = objDescripcion.Text lngCodigo = CLng(Split(objDescripcion.ID, "-").GetValue(1)) lngAcceso = objAcceso.SelectedItem.Value GrabarCategoria(lngCodigo, strNombre, lngAcceso) End If

Next

End Sub En el evento del botn se realiza un ciclo por todas las filas de la tabla tblCategorias, creada en tiempo de diseo. Se comienza de la fila 1 ya que en la 0 estn los textos de encabezado de la tabla. El ciclo termina naturalmente en Count-1. En cada ciclo se obtienen las celdas donde estn los controles. Con la instruccin tblCategorias.Rows(i).Cells(1) se obtiene una celda, de tipo TableCell. Se est leyendo para la fila i del ciclo, y se toma la celda 1. Al igual que las filas, las celdas tambin comienzan desde 0 y van hasta Count-1, pero como en la primera est el id de la categora, se captura la 1 en la variable objCeldaDescripcion, y la 2 en objCeldaAcceso. Ahora, en las variables

objCeldaDescripcion y objCeldaAcceso est cada celda de las columnas 2

I.S.T.Idat

98

ASP.NET

Aplicaciones Web

y 3 (con el nombre y el acceso). Slo se deben buscar los controles dentro de cada celda para
obtener lo que el usuario ha ingresado. El primer control es el nmero 0 (y se sabe que no hay ms), que se carga en objDescripcion, variable de tipo TextBox, con la instruccin objDescripcion = objCeldaDescripcion.Controls(0). Lo mismo se hace para la lista de seleccin de accesos, con la instruccin objAcceso = objCeldaAcceso.Controls(0). Ya se tiene entonces los controles donde el usuario hizo los cambios. Ahora, se debe identificar a que categora corresponde. El identificador de la categora se haba almacenado junto al nombre de la caja de texto y de la lista de seleccin con el formato "categ-" & codigo, en la propiedad ID. Entonces, en la variable lngCodigo se almacena el cdigo de la categora. Para esto, se utiliza la instruccin lngCodigo = CLng(Split(objDescripcion.ID, "-").GetValue(1)). Lo que hace esta lnea es mas simple de lo que aparenta. El la propiedad ID de objDescripcion est el texto con "categ-1". Con la funcin Split, se divide una frase o palabra, con algn carcter. En este caso, el carcter es "-"., y al dividir categ-1 con -, se generan 2 palabras. Una es categ y la otra es 1. Con la instruccin GetValue se obtiene la palabra deseada, siendo 0 la primera (categ) y 1 la segunda (1). Finalizando, la palabra 1 es convertida en un nmero Long y almacenada en la variable lngCodigo. Obviamente, en cada iteracin del For, ir cambiando el valor de la segunda palabra del Split, con el nmero del identificador de la categora. Anteriormente se haba almacenado en la variable strNombre el texto de la descripcin. En la variable lngAcceso se carga el valor de la seleccin que ha hecho el usuario con respecto al acceso de la categora. Por ltimo, se llama a una funcin GrabarCategoria, que graba los valores en la base de datos. Lectura de los controles utilizando la coleccin request.form.keys. Al presionar el botn form.keys, se graban los valores en la tabla, producindose el siguiente resultado:

I.S.T.Idat

99

ASP.NET

Aplicaciones Web

El cdigo del botn Form.Keys es el siguiente, bastante ms simple que el anterior:


Private Sub btnKeys_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKeys.Click Dim lngCodigo As Long Dim strNombre As String Dim objKey As String Dim lngAcceso As Long

lblResultado.Text = "GRABADO UTILIZANDO REQUEST.FORM.KEYS<br><br>"

For Each objKey In Request.Form.Keys If Left(objKey, 5) = "categ" Then

I.S.T.Idat

100

ASP.NET

Aplicaciones Web lngCodigo = CLng(Split(objKey, "-").GetValue(1)) strNombre = Request.Form.Item(objKey) lngAcceso = CLng(Request.Form.Item("acceso-" & lngCodigo.ToString)) GrabarCategoria(lngCodigo, strNombre, lngAcceso) End If Next End Sub La primera diferencia es que al recorrer la coleccin Keys del objeto Request.Form, no se pueden obtener los controles, sino que la informacin que se envi al momento de grabar el formulario (POST). Haciendo un ciclo For Each, en la variable objKey se almacenan todos los nombres y valores de los controles que estaban en la pgina al momento de presionar el botn de grabar. El funcionamiento es muy simple. Por cada elemento que se mand al servidor al presionar grabar, se revisa que el nombre sea del tipo que se defini, es decir, categ-1 y los sucesivos. La forma de hacerlo es comparar los primeros 5 caracteres para que calce con categ. Si es as, es uno de los controles buscados. Entonces, siguiendo un proceso similar al del ejemplo anterior, en la variable lngCodigo se almacena el cdigo de la categora, con la instruccin lngCodigo = CLng(Split(objKey, "-").GetValue(1)). La explicacin de esta lnea es idntica al caso anterior. Posteriormente se almacena en la variable strNombre el texto de la descripcin. Esto debe hacerse utilizando la tradicional sentencia Request.Form(objKey), conocida por todos los programadores del ASP tradicional. En la variable lngAcceso se carga el valor de la seleccin que ha hecho el usuario con respecto al acceso de la categora, utilizando tambin Request.Form, pero solicitando el campo acceso- y el cdigo de la categora, almacenado en la

variable lng Codigo. La sentencia que

realiza esto es lngAcceso = CLng(Request.Form.Item("acceso-" & lngCodigo.ToString)).


Por ltimo, se llama a una funcin GrabarCategoria, que graba los valores en la base de datos.

I.S.T.Idat

101

ASP.NET

Aplicaciones Web A continuacin se utilizarn cajas de seleccin y botones radiales. Para esos casos, es casi trasparente el uso para el programador. Segundo Formulario En el segundo formulario se permitir la seleccin de los valores de la tabla de categoras, en listas de seleccin y botones radiales. Despus de ingresar los controles, la pantalla de pruebas quedar de la siguiente forma:

Los controles creados en esta pgina son los siguientes: CheckBoxList para la lista de cajas de seleccin RadioButtonList para la lista de botones radiales Botn Aceptar que despliega las selecciones del usuario Label de despliegue del resultado de la seleccin

Creacin de los controles

I.S.T.Idat

102

ASP.NET

Aplicaciones Web

En el evento Page_Load se cargan los controles dentro de ambas listas, la de CheckBox y la de RadioButton, llamadas chkList y radList respectivamente. El cdigo para lograr esto se despliega a continuacin. Al igual que en el ejemplo anterior, los datos se cargan en un DataReader (objRs).
While objRs.Read chkList.Items.Add(New ListItem(CStr(objRs("descripcion")), CStr(objRs("codigo")))) radList.Items.Add(New ListItem(CStr(objRs("descripcion")), CStr(objRs("codigo")))) End While

As de simple, y las dos listas estn pobladas. El resultado de esto se despliega en la siguiente pantalla:

Se pueden hacer algunas selecciones y presionar el botn Aceptar.

I.S.T.Idat

103

ASP.NET

Aplicaciones Web

El cdigo detrs del botn Aceptar es el siguiente:


lblResultado.Text = "Items marcados en checkbox<br><br>"

For i = 0 To chkList.Items.Count 1 objListItem = chkList.Items.Item(i) If objListItem.Selected Then lngCodigo = objListItem.Value lblResultado.Text &= objListItem.Text & "<br>" End If Next

I.S.T.Idat

104

ASP.NET

Aplicaciones Web

lblResultado.Text &= "<br>tem marcados en radiobutton<br><br>"

Try lngCodigo = radList.SelectedItem.Value lblResultado.Text &= radList.SelectedItem.Text & "<br>" Catch ex As NullReferenceException lblResultado.Text &= "NO SE HA SELECCIONADO NINGN TEM" End Try Para la lista de cajas de seleccin se debe recorrer verificando si cada elemento est o no seleccionado. Al igual que los dems contadores, este va desde 0 hasta Count-1. Los elementos de estas listas son del tipo ListItem (referencia al final), los cuales poseen las propiedades Value con el identificador de la categora, Text con el nombre de la categora y Selected, que retorna verdadero o falso si est seleccionado. ListItem tiene una gran cantidad de propiedades, pero slo se han destacado las necesarias en este caso. Durante el ciclo, se comprueba que est seleccionada, y en caso positivo, se obtiene el cdigo y el nombre. Para los botones radiales, es mas simple an, pero se debe tener en cuenta un condicin especial. El elemento seleccionado de la lista radial se almacena en radList.SelectedItem. Si no hay ningn elemento seleccionado, lo anterior es NULO y se genera un error si se trata de acceder directamente. En caso que haya algn elemento seleccionado, tanto el identificador como el nombre de la categora se obtienen de las propiedades Value y Text respectivamente. En caso de error, se utiliza el capturador de errores Try...Catch (referencia al final), validando que la excepcin sea por error de NULO (NullReferenceException).

Conclusiones
La utilizacin de controles dinmicos permite construir pantallas ms completas y poderosas. Lamentablemente no siempre es simple de construir.

I.S.T.Idat

105

ASP.NET

Aplicaciones Web Para los controles RadioButtonList y CheckBoxList de ASP.NET, su utilizacin se ha simplificado al mximo. Con algunas lneas de cdigo se pueden crear y leer los controles rpidamente. Para las listas de seleccin y cajas de texto, se complica el funcionamiento. Existen varias formas de hacer lo mismo del primer formulario, de diversa complejidad, y la opcin queda abierta al programador a encontrar la forma que ms le acomode a su trabajo. A su vez, la lectura de los controles, las opciones presentadas son las ms utilizadas, pudiendo encontrar algunas variantes sobre la segunda. Ambas tienen sus ventajas y desventajas. La jerarqua de controles es ms engorrosa de construir, pero no se producen errores en caso de haber controles con el mismo comienzo de nombre. Los controles se identifican con categ-N, pero si existe algn otro control con el nombre categoras, por ejemplo, al aplicar la funcin left con 5, el resultado calza con categ, pero realmente ste no es un control de los que se busca. Nuevamente, es el programador el que debe elegir la que ms le acomode, o buscar variaciones de estas. Referencias Las definiciones de los controles (en ingls) se pueden encontrar en los siguientes artculos RadioButton Web Server Control CheckBox Web Server Control DropDownList Web Server Control TextBox Web Server Control Panel Web Server Control PlaceHolder Web Server Control Table Web Server Control TableRow Web Server Control TableCell Web Server Control ListItem Class Label Web Server Control

Funciones, mtodos y definiciones (en ingls) TryCatchFinally Statements Split Function GetValue Method

VIII BIBLIOGRAFA: CHARTE Francisco

Programacin con Visual Net Edit. ANAYA Espaa 2001

I.S.T.Idat

106

ASP.NET

Aplicaciones Web

CHARTE Francisco

Programacin con Visual Net (Programacin de Bases de Datos ) Edit. ANAYA Espaa 2002 Visual Basic Net Editorial Anaya, Madrid 2002 Manual del Programador 6.0 Editorial Mac Graw Hill Mxico 1999 Programacin Visual Basic 6.0 Editorial Rama Madrid 2000

EVANGELUS Petroulsos MICROSOFT CEVALLOS fco. Javier

Direcciones Web http://www.godot.net http://www.manualesgratis.com http://www.microsoft.com http://www.microsoft.com/spanish/msdn/articulos/archivo/040403/voices/treeview.asp#Tree View_References http://www.microsoft.es http://www.guille.costasol.net http://www.programacion.net/cursos http://www.willydev.net/DesktopDefault.Aspx http://es.gotdotnet.com/quickstart/aspplus/doc/ecommerceapp.aspx http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art185.asp

I.S.T.Idat

107

ASP.NET

También podría gustarte