Post on 03-Aug-2015
description
Aplicaciones Web
INDICE
1.- ASP NET
1.1 Asp Net
1.2 ADO NET
1.3 Clases Básicas para gestión de Datos
1.4 Acciones de Ida y Vuelta de Una WEB
1.5 Directivas den ASP
1.6 Tipos de Datos
1.7 Web Form - controles
1.8 Funciones Numéricas, cadenas y Fechas
2.- Aplicaciones
2.1 Web- form calculo matemáticos
2.2 Empleando el Datgrid1
2.3 Consultas con Hipervínculos
2.4 Consultas en cascada
2.5 Genrador de Propiedades de un datagrid
2.6 Actualizaciones en linea
2.7 Empleando Store Procedure
3.- Reportes
3.1 Crystal Report entorno para el diseño
3.2 Creación de unos reportes simple con campos enlazados
3.3 Ejecución de un reporte desde un formulario
3.4 Filtros en un reporte
4.- Web Service
4.1 Definición
4.2 Web Method
4.3 Publicación de los Web Service
4.4 Acceso a los servicios
4.5 Aplicación con web Services
Anexo:
Algunos trucos en ASP .NET
Cómo crear y leer controles dinámicamente en ASP .NET
I.S.T.”Idat” 1 ASP.NET
Aplicaciones Web
PLATAFORMA MICROSOF.NET
Microsoft .NET se compone de un conjunto de recursos que hacen posible su implementación,
estos componentes se muestran en la siguiente ilustración:
VISUAL STUDIO.NET Internet
.NET Framework
.NET Enterprise Servers
.NET Building Block Services
2. Servidores Empresariales.NET
Microsoft Exchange Server: Ofrece servicios de mensajería (correo electrónico) y
colaboración entre aplicaciones (workflow).
Microsoft Host Integration Server: Realiza la comunicación 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 integración entre los usuarios y las aplicaciones clientes que corran en diferentes
dispositivos (PCs, dispositivos móviles, 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 válido y puede participar en un sitio Web, aparte tiene otras
ventajas como reducir el tiempo de autenticación, guardar contenido personalizado. etc.
Hotmail utiliza el servicio de Passport para la autenticación de usuarios y guardar información
de éste en el Web.
Microsoft Hailstorm: Usa los servicios de Passport para guardar información 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
I.S.T.”Idat” 2 ASP.NET
Aplicaciones Web
Fl Marco .NET (en ingles .NET Framework) es la piedra angular de la plataforma .NET y
constituye u.i enlomo para la creación, distribución y ejecución de servicios Web, así como de
otros tipos de aplicaciones.
Se compone de cuatro partes principales que son:
1. Tiempo de F-jccución en Lenguaje Común (CLR)
Es el RunTime común 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 aplicación, así como administrar su trabajo con el sistema.
2. Librería de Clases .NET
Son un conjunto de componentes que sirven para acceder a través 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 creación, distribución y mantenimiento de aplicaciones
Web así como de Servicios Web XML que son la razón de ser de la plataforma .NET
TIEMPO DE EJECUCIÓN EN LENGUAJE COMÚN (CLR)
Introducción al RunTime y al CLR
Un RunTime es la aplicación responsable de manejar la asignación de memoria, inicio y
eliminación de procesos mientras un programa se está ejecutando, así como de brindar seguridad
al código, y también gestionar su relación con otros programas o componentes.
l.os RunTime lian sido usados por los lenguajes de programación como Visual Basic cuyo nombre
es el VBRLN, Visual C++ cuyo nombre es MSVCRT. Pero también Visual FoxPro, JScnpt,
SmaIlTalk. Per!, Python. Java, etc. tienen su propio RunTime.
Cada aplicación Visual Basic 6 que se quería 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 Ejecución en
Lenguaje Común) y es la solución a los diferentes tipos de RunTime que manejan los diferentes
lenguajes de programación antes mencionados, que ahora serán
Gestionados en ejecución por un único RunTime común.
La ventaja de tener un solo RunTime son múltiples 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
I.S.T.”Idat” 3 ASP.NET
Aplicaciones Web
El CLR es el motor de ejecución de las aplicaciones del Marco .NET. Proporciona una serie de
servicios, entre los que se incluyen los siguientes:
Administración del código (carga y ejecución).
Aislamiento de la memoria de la aplicación.
Comprobación de la seguridad de los tipos.
Conversión del (Lenguaje Intermedio) a código nativo
Acceso a los metadatos (información de tipo mejorada)
Administración de memoria para los objetos administrados
Aplicación de seguridad de acceso al código
Control de excepciones, incluyendo excepciones en varios lenguajes
Interoperabilidad entre el código administrado, los objetos COM y las DLL anteriores (datos y
código no administrados)
Automatización del diseño de objetos
Suporte para servicios de desarrolladores (creación de perfiles, depuración, etc.)
Sistema de auto registro o auto descripción 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 adiós al problema de la compatibilidad de versiones de las dll.
Esta información se utiliza en tiempo de ejecución para resolver referencias, aplicar las directivas
del enlace de versiones y validar la integridad de los ensambladores cargados. El tiempo de
ejecución puede determinar y ubicar el ensamblador para cualquier objeto de ejecución, 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 código. La prueba de identidad de cada ensamblador se considera
individualmente cuando .Se determinan los permisos que contiene para otorgar al código.
Espacio de Nombre
Un espacio de nombre (NameSpace) es un esquema de denominación lógica para los tipos en los
que un nombre de tipo sencillo, como OLEDB. Va precedido de un nombre jerárquico separado
por puntos. Dicho esquema se encuentra totalmente bajo el control del desarrollador.
Las herramientas de diseño pueden utilizar los espacios de nombre para facilitar a los
desarrolladores el proceso de exploración y referencia a los tipos en su código. El concepto de
espacio de nombre no está relacionado con el del ensamblador. Un único ensamblador puede
contener tipos cuyos nombres jerárquicos dispongan de distintas raíces de espacio de nombre y
una raíz lógica de este tipo puede abarcar varios ensambladores.
I.S.T.”Idat” 4 ASP.NET
Aplicaciones Web
En el Marco .NET. un espacio de nombre es una conveniencia lógica de denominación en tiempo
de diseño, mientras que un ensamblador establece el ámbito de nombre para los tipos en tiempo
de ejecución.
En Visual Basic, por ejemplo para hacer uso de un Assemblie hay que usar los espacios de
nombre con la declaración Imports, por ejemplo si quisiéramos acceder a datos con SQL Server y
manejar archivos de texto en una aplicación Windows realizaríamos la siguiente declaración:
Imports Systein.Windows.Forms
Imports System.Data.SQL
Imports System.10
CAPITULO 2: VISUAL STUDIO .NET
Introducción a Visual Studio .NET
Definiendo Visual Studio .NET
Visual Sludio .NET es la Herramienta Rápida de Desarrollo (RAD) de Microsoft para la siguiente
generación de Internet que son los Servicios Web XML. Esta herramienta permite la creación de
aplicaciones usando el Marco .NET, es decir usando el CLR, la Librería de Clases, ADO .NET,
ASP .NET, etc.
Es un software que brinda las herramientas necesarias para crear, distribuir, administrar dar
mantenimiento a aplicaciones Web distribuidas que usan Servicios Web XML, todo esto con una
gran facilidad, rapidez y bajo costo.
Se puede crear aplicaciones Web directamente usando el Framework .NET y algún programa
editor, por ejemplo el Bloc de Notas, pero el tiempo que llevaría el desarrollo no justificaría el
ahorro de costos, en cambio, si se utiliza una herramienta como Visual Studio.NET el tiempo de
desarrollo se reduciría enormemente.
Visual Studio .NET permite también la integración y el uso cruzado de lenguajes de programación:
Visual Basic .NET. Visual C# .NET, Visual C-H- .NET y JScript .NET
A diferencia de la versión anterior no existe Visual InterDev, ni Visual J++-, además Visual FoxPro
.NET no comparte tas características unificadas del Marco .NET
Herramienta Rápida de Desarrollo (RAD)
La principal ventaja de Visual Studio .NET es realizar la creación de aplicaciones de forma fácil y
rápida, 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:
Creación de Páginas Web mediante Formularios Web
Visual Studio .NET incluye un diseñador de páginas Web HTML y ASP .NET basado en
formularios Web. El diseñador permite arrastrar controles, clases de datos, y otros objetos y
configurar sus propiedades como si fuese un formulario de una aplicación para Windows.
I.S.T.”Idat” 5 ASP.NET
Aplicaciones Web
Creación de Servicios Web XML
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. También podemos usar un Servicio Web
haciendo referencia desde un proyecto mediante la opción "Add Web Referente" del menú
"Project".
Creación 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 características de un objeto a otro, esto este presente en
todos los objetos creados en Visual Studio .NET, sean visuales o no.
Creación de archivos XML
Con el diseñador de XML, crear un archivo XML es más fácil que nunca, ya que se muestra de
colores el código y sé auto completan los Tags que uno va escribiendo. Este
Maneja 3 vistas: XML, esquemas y datos.
Existen mas características RAD en Visual Studio .NET, las cuales trataremos mas adelante.
Lenguajes en .NET
En Visual Studio .NET vienen los siguientes Lenguajes de Programación:
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 versión del tradicional Active Server Pages se ha lanzado al
público, 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 versión mejorada de C++) hasta incluso JScript.net.
Pero, ¿cúal es la diferencia de ASP.net con el ASP común que conocemos?
Mucha, realmente es mucha. Mientras ASP se escribía 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 leído, ya no puedes utilizar VBScript sino que debes utilizar VB.net que es lo que más se
aproxima. Otro cambio radical es que ASP.net es un lenguaje totalmente orientado a objetos.
I.S.T.”Idat” 6 ASP.NET
Aplicaciones Web
¿Que mejoras trae ASP.net? ¿Es realmente mejor que ASP?
Sin duda, es mucho mejor que el ASP tradicional, ASP.net trae diversas mejoras entre las cuales
se destacan:
Rendimiento: la aplicación de compila en una sola vez al lenguaje nativo, y luego, en
cada petición tiene una compilación Just In Time, es decir se compila desde el código nativo, lo
que permite mucho mejor rendimiento. También permite el almacenamiento del caché en el
servidor
Rapidez en programación: mediante diversos controles, podemos con unas pocas líneas y en
menos de 5 minutos mostrar toda una base de datos y hacer rutinas complejas.
Servicios Web: trae herramientas para compartir datos e información 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 tecnología 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 capítulo 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 aplicación 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 orígenes 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 raíz 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” 7 ASP.NET
Aplicaciones Web
fuente microsoft.net
El problema es comunicar un programa o aplicación con una base de datos y más que comunicar
se pretende que el programa o aplicación 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 continuación:
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 conexión alguna con un
origen de datos, sino que simplemente representan los datos en sí mismos.
System.Data.Common: ofrece clases comunes entre distintos orígenes de datos. Para lo que
vamos a tratar en este artículo, podemos decir que estas clases sirven de clase base para las que
están contenidas en los dos espacios de nombres que vienen a continuación.
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, según decíamos, no tienen conexión
alguna con dicho origen de datos. Las clases de System.Data.OleDb usan OLEDB como
tecnología subyacente.
I.S.T.”Idat” 8 ASP.NET
Aplicaciones Web
System.Data.SqlClient: contiene clases que permiten interactuar con orígenes de datos SQL
Server de un modo mucho más 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 prácticamente equivalente al de las que se encuentran en
System.Data.OleDb.
LAS CLASES BÁSICAS DE ADO.NET Las he llamado básicas porque, realmente, serán el pilar fundamental para casi cualquier
aplicación que tenga que acceder a un origen de datos con unos mínimos requisitos de eficiencia
y escalabilidad. Las clases más importantes del espacio de nombres System.Data son:
DataSet: Es la piedra angular del modelo de objetos: Esta clase permite tener en memoria una
auténtica "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 físico
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 también 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 colección de objetos
DataTable, y dicha colección es de la clase DataTableCollection. Por otra parte, cada objeto
DataTable representa sus filas en la propiedad Rows (de la clase DataRowCollection), siendo
I.S.T.”Idat” 9 ASP.NET
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 utilizarImports System.Data.SqlClient 'Para acceder a SQL ServerImports System.Data.OleDb. 'Para cualquier origen de datos
Aplicaciones Web
cada 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 relación entre dos objetos DataTable. También pertenece al
espacio de nombres System.Data. Todas las relaciones que haya en un DataSet se encuentran
en la colección Relations, de la clase DataRelationCollection.
Las clases más 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 más o menos equivalentes
a la clase Connection del antiguo ADO, en tanto en cuanto que proporcionan la conexión con el
origen de datos y mantiene algunas de sus antiguas propiedades y métodos, como son
ConnectionString, ConnectionTimeOut, Open y Close. Sin embargo, al igual que las otras clases
que también tienen un equivalente (más o menos) en la tecnología antigua, ten presente que no
se manejan exactamente igual, como tendremos ocasión de ver más adelante.
SqlCommand: su equivalente en OleDb es OleDbCommand. También 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 parámetro
dentro de la colección Parameters del objeto SqlCommand u OleDbCommand, según el caso. La
colección 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, según proceda) en sus propiedades SelectCommand, InsertCommand,
UpdateCommand y DeleteCommand. Cuando se invoca el método 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 método Update, el
DataAdapter ejecuta el comando establecido en su propiedad InsertCommand para añadir al
origen de datos las filas nuevas añadidas 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
I.S.T.”Idat” 10 ASP.NET
Aplicaciones Web
datos físico. Si la conexión estaba cerrada antes de ejecutar los métodos Fill o Update, el
DataAdapter se ocupa de abrir dicha conexión para efectuar la operación requerida, cerrando de
nuevo la conexión una vez que ha terminado. Si la conexión estaba abierta, el DataAdapter deja
que dicha conexión siga abierta después de haber terminado.
SqlCommandBuilder: su equivalente en OleDb es OleDbCommandBuilder. Tampoco había
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 métodos
GetInsertCommand, GetUpdateCommand y GetDeleteCommand.
Resumiendo
Objetos de Proveedores de Datos .NET
Propósito Objeto SQL Server 7.0 o 2000
Objeto para un origen OLEDB
ConnectionProvee conectividad a un Origen de Datos
SqlConnection OleDBConnection
CommandProvee acceso a comandos de Base de Datos como Select, Delete, Insert y Update
SqlCommand OleDBCommand
DataReaderProvee acceso a datos de solo lectura
SqlDataReader OleDBDataReader
DataAdapter
Utiliza el objeto Connection para enlazar un objeto DataSet con un Proveedor de Datos. También permite actualizar los Datos en el origen a partir de las modificaciones hechas en el DataSet.
SqlDataAdapterOleDBDataAdapter
I.S.T.”Idat” 11 ASP.NET
Un DataSet guarda información en un entorno desconectado. Después de que usted establece una conexión 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 conexión con el origen de datos. La conexión se reestablece recién cuando usted necesita actualizar los cambios
Aplicaciones Web
Los datos siempre viajan en formato XML ASP.NET y ADO.NET transforman en forma automática XML en un DataSet.
Aplicaciones..- Listado de datos empleando los controles de BDD
Se puede acceder al conjunto de servidores mediante(ver Explorador de servidores)
Hacer la conexión 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
configuración anterior.
I.S.T.”Idat” 12 ASP.NET
Vamos a crear una Base de Datos en el Servidor:
• Haga click en el nombre de su servidor. Presione el botón derecho del Mouse. Seleccione 'Nueva Base de Datos'
Control datagrid1
Aplicaciones Web
Acciones de ida y vuelta
Uno de los conceptos principales que debe comprender es la división del trabajo en una página de
formularios Web Forms. El explorador presenta el formulario al usuario y éste interactúa con él,
causando que el formulario se envíe de vuelta al servidor. Sin embargo, como todo procesamiento
que interactúa con componentes de servidor debe ocurrir en el servidor, esto significa que, para
cada acción que necesita procesamiento, el formulario debe enviarse al servidor, procesarse y ser
devuelto al explorador
Servidor .NET (Active Server Pages .NET). Es una tecnología para generar páginas
dinámicas en el servidor y enviarlas al cliente (navegador Web) que las ha solicitado,
ejecutando previamente el código que contienen (código Visual Basic, C#, etc.) y
convirtiendo el resultado a código 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 navegación clásica en que el sevidor
espera (escucha) peticiones del cliente y, cuando las recibe, envía automáticamente la
respuesta (generalmente un documento HTML que es mostrado en el navegador Web),
aquí el servidor ejecuta algún tipo de procesamiento a raíz de la petición del
cliente y elabora dinámicamente la respuesta que devuelve. En esquema sería:
El cliente (explorador Web) se conecta al servidor Web gracias a su URL
El cliente envía una petición al servidor (solicita una página Web). El cliente puede
ejecutar código (en el lado del cliente), con secuencias de comandos que se utilizan para
generar efectos dinámicos en el cliente (DHTML). Este código no se procesa en el
servidor
El servidor busca la página solicitada y ejecuta el código contenido en ella. Este código
del lado del servidor se escribe en secuencias de comandos (para tareas simples) pero
también en lenguajes compilados (Visual Basic, C#, etc., para tareas complejas como son
cálculos matemáticos, recuperación de datos, gestión de sitios, comercio electrónico, etc.)
El servidor traduce el resultado de la ejecución del código a HTML y lo envía al cliente
El cliente muestra al usuario el documento recibido. Si el usuario consulta el código fuente
del documento que visita, no verá el código original del archivo que reside en el servidor,
sino solamente código HTML en que la tecnología ASP .NET ha convertido el resultado
del procesamiento
CONFIGURACIÓN DE ASP .NET: para poder ejecutar páginas 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 tecnología de servidor, requiere un servidor Web en ejecución, de ahí la
necesidad de IIS.
Teóricamente no se puede utilizar en Windows XP Home ya que no aparece
como opción 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 también 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 páginas ASP .NET. La instalación de Visual Studio .NET
conlleva automáticamente la del SDK de .NET Framework.
I.S.T.”Idat” 14 ASP.NET
Aplicaciones Web
Las páginas ASP .NET tienen la extensión aspx. Para visualizar adecuadamente una
página 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 página
aspx funcione, debe ser filtrada por el servidor Web, por lo que es necesario dirigir el
navegador Web a http://localhost (dirección de la máquina local) y ahí a la dirección
correcta del archivo aspx.
COMPONENTES BÁSICOS DE UNA PÁGINA ASP .NET:
En la primera línea destaca la directiva
<%@ Page Language="Vb" %>
que dice al servidor Web que se trata de una página ASP .NET y que usa Visual
Basic .NET como lenguaje de programación. También podría ser
<%@ Page Language="Cs" %>
en caso de usar C# como lenguaje de programación.
Después de la directiva @ Page vienen bloques de declaración de código, en
lenguaje Visual Basic .NET, incluidos en la etiqueta
<script runat=server><script>
Aquí es donde debe ir todo o la mayor parte del código Visual Basic ya que este
código es el único compilado a MSIL
Después comienza el código HTML. Este código, junto con el resultado del código
ASP .NET, es enviado al cliente. En esta sección puede haber bloques
proveedores de código 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 declaración de código
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 página pueden aparecer elementos conocidos de HTML pero que
se declaran de manera especial:
<asp:textbox runat=server></asp:textbox>
Son controles Web, con algunas funcionalidades similares a las de los
elementos HTML del mismo nombre pero con otras añadidas por ASP .NET
SEPARACIÓN DE CÓDIGO VB Y CONTENIDO HTML: En muchas ocasiones es útil
mantener el contenido HTML de las páginas fuera del código Visual Basic, aumenta la
I.S.T.”Idat” 15 ASP.NET
Aplicaciones Web
legibilidad del código fuente de los archivos y facilita su modificación por el
programador. Se pueden usar formularios con código de apoyo, llevando a estos
formularios o archivos de código *.vb todo el código Visual Basic del archivo aspx y
declarando en ellos versiones públicas de los controles de servidor que se usan en la
página. Por ejemplo, para una etiqueta llamada lbEtiqueta en el archivo aspx, se puede
escribir en el archivo de código:
Public lbEtiqueta As Label
de esa manera, el control de servidor lbEtiqueta (Label) de la página aspx es una instancia de la
variable lbEtiqueta de la clase datagridVb declarada en el archivo vb y, desde el código 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 código de apoyo:
- la página Asp .NET datagrid.aspx contiene solamente código HTML con controles de servidor
- el archivo de código de apoyo datagrid.aspx.vb contiene el código Visual Basic .NET con
declaraciones de variables y procedimientos
Ambos archivos han de estar juntos en la misma carpeta para que funcione el código actual pero,
como se verá más adelante, pueden estar situados en carpetas diferentes. El archivo
datagrid.aspx necesita de estos atributos en la directiva @ Page al comienzo del código:
- 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 página aspx (puede ser cualquier
clase derivada de la clase Page), y el atributo Src, que especifica el archivo de código fuente en
el que se define la clase heredada (es compilado dinámicamente cuando se solicita la página
aspx); este archivo puede estar situado en cualquier carpeta del servidor, sólo hay que
especificarlo correctamente en la ruta.
Así es como debe ser configurado al colocar las páginas en el servidor Web:
<%@ Page Language="vb" Inherits="datagridVb" Src="datagrid.aspx.vb" %>
(aquí la página aspx hereda la clase datagridVb, que está descrita en el archivo
datagrid.aspx.vb, que es compilado en tiempo de ejecución)
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 página (el
I.S.T.”Idat” 16 ASP.NET
Aplicaciones Web
diseñador de formularios Web Forms de Visual Studio .NET usa este atributo para averiguar
dónde 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 diseño) (Codebehind no se usa en
tiempo de ejecución), y el atributo Inherits, que define la clase que hereda la página aspx.
Así es como debe ser configurado mientras se trabaja con la página dentro de Visual Studio .NET:
<%@ Page Language="vb" Codebehind="datagrid.aspx.vb" Inherits="datagrid.datagridVb"
%>
(aquí la página 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 página a medida que se va construyendo)
ESPACIOS DE NOMBRES Y HERENCIA: A su vez, en el archivo de código 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 código va en la página aspx
(Asp .NET lo hace automáticamente por nosotros) y también 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 también 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
* , / Multiplicación y división real
\ división entera
Mod residuo de una división entera
A=23\4 la respuesta es 5
A= 23 mod 4 resultado 3
Operadores de comparación
Igualdad (=)
Desigualdad (<>)
I.S.T.”Idat” 17 ASP.NET
Otros operadores complementariosAsigna y opera+=, -= ,*= , /= , ^=a=a+5 equivale a+=5
Aplicaciones Web
Menor o mayor que (<,>)
Mayor o igual que (>=)
Menor o igual que (<=)
Like
Explicación
TypeOf...Is
Conversión de tipos
Var = CType(Val("10 * 25"), Integer)
Con esto le estamos diciendo al VB que primero convierta la cadena en un número mediante la
función Val, (que devuelve un número de tipo Double), después le decimos que ese número
Double lo convierta en un valor Integer.
También podríamos hacerlo de esta otra forma:
i = CInt(Val("10 * 25"))
Nombre de la función
Tipo de datos que devuelve
Valores del argumento "expresion"
CBool(expresion) Boolean Cualquier valor de cadena o expresión numérica.
CByte(expresion) Byte de 0 a 255; las fracciones se redondean.
CChar(expresion) Char Cualquier expresión de cadena; los valores deben ser de 0 a 65535.
CDate(expresion) Date Cualquier representación válida 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 FormAplicación 1.- Sin incluir controles Form
Resultado
Codificación.-<%@ 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>
Aplicación 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 elección: " + 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 también se puede emplear un arreglo dinámicoDim 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 más importante a recordar es que en este modelo de programación el codigo en
vbNet estará embebido o empotrado junto con codigo html.
2.- Este codigo mezcla instrucciones y objetos de dos lenguajes de programación diferentes, ellos
son HTML y vbNet.
3.- El problema es que los objetos HTML no tienen suficientes propiedades y métodos para
resolver muchos problemas de programación, por esta razón Microsoft.Net crea unas
cubiertas?(WRAPPERS) para cada uno de ellos, en su librería System.Web.UI.Control, o
colección 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 métodos 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 compilación 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 programación es que de
los objetos htmlcontrols se pueden manipular directamente sus propiedades y métodos, 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 renglón de instrucción en vbnet se puede resolver el problema completo.
Empleando Web Form con códigos en Visual VB
Comienza con una directiva o instrucción 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 DESCRIPCION
@ Page Define atributos usados para compilar paginas ASP.NET
@ Control Define atributos usados para compilar controles de usuarios
@ Import Importa NAMESPACES desde la librería de clases de .NET
@ Register Define alias, tais, y otros parámetros para controles de usuarios y normales
@ Assembly Identifica otros archivos ( assemblies) para enlazar a esta pagina
Aplicación.- Ingresando un radio muestra su area en una etiqueta e ingresando una cadena o
párrafo lo ordena de forma ascendente
Ejemplos:
CódigosPublic 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
I.S.T.”Idat” 22 ASP.NET
Aplicaciones Web
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 '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
I.S.T.”Idat” 23 ASP.NET
Aplicaciones Web
FUNCIONES CON NUMEROS
Funcion DevuelveAbs Valor absoluto de un numero realInt Parte entera de un realRnd Un numero al azr entre 0 y 1Exp Exponecial de un numero real es decir e = 2.71828
El objeto Math.funciones
Math. Reunid (nov. - Redondea, con ciertos números 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 número especificado
Math.ceiling.- Devuelve el número entero más pequeño mayor o igual que el número especificado.
Math.ceiling(3.1) 4
Math.Floor.- Devuelve el número entero más grande menor o igual que el número especificado
Math.Floor(3.1) 3
Math.sqrt(n).- Devuelve la raíz cuadrada de un número especificado.
Math.pow(n).- Devuelve un número especificado elevado a la potencia especificada
Funciones Fechas.
Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la información relativa a la
fecha y la hora. Dispone para ello de una declaración de variable: Date. Una variable declarada
como date puede contener una fecha, una fecha y una hora o una hora solamente.
Dim MyDate As DateDim MyMonth As IntegerMyDate = #2/12/1969# ' Assign a date.MyMonth = Month(MyDate) ' MyMonth contains 2.Now Devuelve la fecha y hora actual.WeekDay Devuelve el día de la semana (En número, 1=Domingo, 2=Lunes,...)Dim MyDate As DateDim MyWeekDay As IntegerMyDate = #2/12/1969# ' asigna una fechaMyWeekDay = Weekday(MyDate) ' MyWeekDay contains 4 Day Obtiene el día, a partir de una fecha Dim MyDate As DateDim MyDay As IntegerMyDate = #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.
I.S.T.”Idat” 24 ASP.NET
Aplicaciones Web
Year Obtiene el año a partir de una fecha. MyYear = Year(MyDate) ' MyYear contains 1969.
Hour Obtiene la hora a partir de una hora
Minute Obtiene el minuto a partir de una hora.
Second Obtiene el segundo a partir de una hora.
DateAdd Añade un intervalo de tiempo a una fecha
Interval
Requerido. Valor de enumeración DateInterval o expresión String que representa el
intervalo de tiempo que se desea agregar.
Number
Requerido. Double. Expresión de punto flotante que representa el número 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. Expresión 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.
ValoresEl argumento Interval puede tener uno de los siguientes valores:
Valor de enumeración Cadena Unidad de intervalo de tiempo agregada DateInterval.Day d Día; truncado al valor integral DateInterval.DayOfYear y Día; truncado al valor integral DateInterval.Hour h Hora; redondeada al milisegundo más cercano DateInterval.Minute n Minuto; redondeado al milisegundo más cercano DateInterval.Month m Mes; truncado al valor integral DateInterval.Quarter q Trimestre; truncado al valor integral DateInterval.Second s Segundo; redondeado al milisegundo más cercano DateInterval.Weekday w Día; truncado al valor integral DateInterval.WeekOfYear ww Semana; truncada al valor integral DateInterval.Year yyyy Año; 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 función DateAdd, se muestra la fecha
correspondiente un número especificado de meses en el futuro.
I.S.T.”Idat” 25 ASP.NET
Aplicaciones Web
Dim Msg, Number, StartDate As String 'Declare variables.Dim Months As DoubleDim SecondDate As DateDim IntervalType As DateIntervalIntervalType = DateInterval.Month ' Especifica intervalos en meses.StartDate = InputBox("Ingrese fecha ")SecondDate = CDate(StartDate)Number = InputBox("Ingrsa el numero de meses a adicionar")Months = Val(Number)Msg = "New date: " & DateAdd(IntervalType, Months, SecondDate)
Aplicación con Datgrid pero sin conexión a BDD
Public Class WebForm3 Inherits System.Web.UI.Page+codigo GeneradoDim 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
I.S.T.”Idat” 26 ASP.NET
RequieredFieldValidator.-(valida2)Errormensage Campo oblugatorio ControlTovalidate:TxtmonRangeValidator (Valida1)ErrorMessage.- Mes entre 6- 18ControlTovalidate.- Txtmes
ValidationSummary .- Resumen de errores
Aplicaciones Web
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")) 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 SubEnd Class
Aplicacion empleando Hipervínculos en un formulario
Se ingresa el código 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
I.S.T.”Idat” 28 ASP.NET
Dar el encabezado para cada columna en columna enlzada
Y en columna Hipervínculo llamar al formularioFrmdetalle.aspx pasando el numero de orden={0}
Aplicaciones Web
Formulario FRMDETALLE.ASPX
Codificación en el formulario FRMOrden.aspx
Imports System.Data.SqlClientPublic 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
+ Código generado por el Diseñador 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 SubEnd Class
Codificación FRMDETALLE.ASPX pasando el numero de pedido (orden)
Codificación
Imports System.Data.SqlClientPublic 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 " Código generado por el Diseñador 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 código de usuario para inicializar la página 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 ClassAplicación Consulta en cascada .- en un DropDownList1 colocar los nombres de los clientes
(CompanyName) pero cuando se elige un cliente que acceda a su código CustomerId , mostrando
en DropDownList2 todos sus pedidos y al elegir un pedido que muestre el detalle de ese pedido
Imports System.Data.SqlClientPublic 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
+ " Código generado por el Diseñador 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 código de usuario para inicializar la página
I.S.T.”Idat” 31 ASP.NET
Controles empleados
DropDwonList2(para Clientes)
DropDownList1Para pedidos
Ambos colocar en la propiedad:AutoPostBack=TruePara que pueda seleccionarse
Un Datagrid1 y una etiquita LBtot
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 SubEnd 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 conexión es a traves de un proveedor, la aplicación
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.SqlClientImports System.Data.OleDbImports 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 Código generado por el Diseñador 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 código de usuario para inicializar la página 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 SubEnd Class
Aplicación con Web Form Empleando la BDD Universidad
Adición y eliminación e datos sin emplear Store Procedure
Codificación.-
‘Autor : A. MorenoImports System.Data.SqlClientPublic 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+ Código generado por el Diseñador 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 código de usuario para inicializar la página 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 SubEnd Class
Aplicación 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)asinsert into alumno values(@cod,@ape,@nom,@idesp,@pro)return
Para anularcreate Procedure SP_DELALU@COD CHAR(5)asdelete from alumno where idalumno=@codreturn
I.S.T.”Idat” 38 ASP.NET
Aplicaciones Web
‘Autor: A. MorenoImports System.Data.OleDbImports System.TextPublic 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;SERVER=(LOCAL)")+ Código generado por el Diseñador de Web Forms "Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Introducir aquí el código de usuario para inicializar la página 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 SubEnd 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 paginación del listado
Imports System.DataImports System.Data.SqlClientPublic 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+ Código generado por el Diseñador 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
Edición, y Eliminación de Registros en Línea
Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva
información o para corregir algún error de captura original o para agregar alguna columna que no
existía por modificación 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
edición a los renglones que muestra el dataset, estas columnas de edición traen sus propios
métodos, mismos que se pueden cargar con codigo para procesar
Instrucciones empleadas.-
Itemcommand Se produce cuando se hace clic en cualquier botón 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 información específica para el eventoPropiedad DescripciónCommandArgument (se hereda de CommandEventArgs)
Obtiene el argumento del comando.
CommandName (se hereda de CommandEventArgs)
Obtiene el nombre del comando.
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 colección 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 colección se llena automáticamente 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 actualización para la revisión de un
registro específico del origen de datos. El campo clave ayuda a la cadena de consulta de
actualización a identificar el registro apropiado que se debe modificar.
Para obtener más información sobre cómo obtener acceso a datos con ASP.NET, vea Acceso a
datos con ASP.NET.
I.S.T.”Idat” 44 ASP.NET
Aplicaciones Web
DatakeyField
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 colección
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
actualización para la revisión de un registro específico del origen de datos. El campo clave ayuda
a la cadena de consulta de actualización 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 información 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 código 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 cómo recuperar la descripción 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
I.S.T.”Idat” 45 ASP.NET
Aplicaciones Web
If CType(e.CommandSource, Button).CommandName = "AddToCart" Then
' 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
Edición y Modificación
Pasos :a) En el datagrid hacer Clic derecho: utilizar generador de propiedades:
I.S.T.”Idat” 46 ASP.NET
DataGrid.- con el nombre Grid DataKeyField: Cli_codigo, colocar en las cajas de textos : Txtncod, Txtnom, txtdireccion y txtruc
Aplicaciones Web
Enlazar en cada columna con los nombres de los campos en forma a priori, estos campos
tienen que ser seleccionados en la instrucción 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 SqlConnectionDim Cmd as SqlCommandDim StrSql as StringSub Page_Load Cn=New SqlConnection("Server=(Local);Uid=Sa;Database=Bdfactura") if Not Page.Ispostback then EnlaceGrid End ifEnd 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 SubSub Grid_Editar(s as Object,e as DatagridCommandEventArgs) Grid.EditItemIndex=e.Item.ItemIndex EnlaceGridEnd SubSub 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 SubSub Grid_Cancel(s as Object,e as DatagridCommandEventArgs) Grid.EditItemIndex=-1
EnlaceGridEnd SubSub 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 Subpublic 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 Subpublic 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="" EnlaceGridEnd 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></TABLE><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
Estas lineas agrege para asignar los eventos
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 específico o la tecnología de
acceso a bases de datos.
Modelos de extracción e inserción
Con el fin de ofrecer el acceso a datos más flexible para los programadores, los controladores de
base de datos de Crystal Reports se han diseñado para proporcionar un modelo de extracción e
inserción de acceso a datos.
Modelo de extracción
En un modelo de extracción, el controlador se conectará a la base de datos y extraerá datos cuando se necesiten. Con este modelo, Crystal Reports controla tanto la conexión a la base de datos como el comando SQL que se ejecuta para obtener los datos y no necesita ninguna codificación del programador. Si no se escribe ningún código especial en tiempo de ejecución, se utiliza el modelo de extracción.Modelo de inserción
En comparación, el modelo de inserción necesita que el programador escriba código 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 método
le permite crear recursos compartidos de conexión en la aplicación y filtrar los datos antes de que
Crystal Reports los reciba.
Los controladores de bases de datos se utilizan durante el tiempo de creación y de
procesamiento.
I.S.T.”Idat” 51 ASP.NET
Aplicaciones Web
Durante el tiempo de creación, 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 la conexión a una base de datos y la selección de las tablas, vistas o procedimientos
almacenados para especificar el esquema. Con los controladores ADO.NET y de definición de
campos, este proceso implica la selección de un esquema con la forma de un archivo XML (*.xml)
o de un archivo de definición 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
Base de datos a las que se tiene acceso
Método de acceso a datos
OLEDB Cualquier base de datos que tenga un proveedor OLEDB.
Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros ADO.
ODBC Cualquier base de datos que tenga un proveedor ODBC.
Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros RDO.
Access/Excel Bases de datos de Microsoft Access y libros de Microsoft Excel.
Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros DAO.
ADO.NET Cualquier base de datos con un proveedor gestionado.
Admite la inserción de datos en el informe desde un conjunto de datos ADO.NET.
Este controlador no extraerá datos por sí mismo.
Definición de campo
Ninguna.
Este controlador especial se utiliza para crear informes basados únicamente en un
El controlador se incluye principalmente para la compatibilidad con versiones anteriores y sólo se utiliza durante el proceso de creación
I.S.T.”Idat” 52 ASP.NET
Aplicaciones Web
esquema sin datos reales.de informes.
En tiempo de ejecución, debe enviarse un conjunto de registros o un conjunto de datos a un informe creado con el controlador.
Objeto de datos Crystal (CDO)
Ninguna.
Este controlador especial obtiene acceso a datos que no residen en una base de datos tradicional.
Este controlador se incluye principalmente para la compatibilidad con versiones anteriores.
Este controlador sólo admite la inserción 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 período de creación del informe. Seleccione uno de los controladores disponibles para crearlo.
Crear un reporte
Independientemente de cómo se hará la presentación, el reporte se define en un archivo ".RPT",
que forma parte de su proyecto. Ese archivo especifica el modo en que se hará la presentación
del reporte, pero no incluye los datos propiamente dichos. Los datos se definirán en el tiempo de
ejecución.
Crystal Reports se basa en un concepto muy común de la definición de reportes: los reportes se
componen de "secciones", y cada sección es un espacio horizontal en la página. Existen diversos
tipos de secciones, por ejemplo:
I.S.T.”Idat” 53 ASP.NET
Aplicaciones Web
Encabezado del reporte, aparece en la primera página.
Encabezado de página, aparece en la parte superior de todas las páginas.
Detalle: lo más importante. En el tiempo de ejecución, se genera una de estas secciones
para cada línea (registro) en la base de datos.
Pie de página, aparece en la parte inferior de todas las páginas.
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 más secciones, en caso de que no sean necesarias.
Acceder a la base de datos
Antes de crear el reporte, hay que decidir cuál 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 código.NET
"puro". En una aplicación.NET, probablemente sea deseable realizar el acceso a través de
ADO.NET. Para ello, lo más fácil es definir un Conjunto de datos tipificado, aun antes de crear el
reporte.
Un Reporte Sencillo en ASP Net
Creamos una Aplicación 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 después, luego nos muestra la
siguiente ventana:
Asistente de Informes Estandar
En la ventana de Asistente de informe estándar, 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 diseño 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 código 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 WithEnd 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 según una
categoría, 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 diseño de la siguiente manera:
Control Propiedad Valor DropdownList ID ddlcategorias
AutoPostBack True
CrystalReportViewer ID CrVProductosDisplayGroupTree False
I.S.T.”Idat” 61 ASP.NET
Aplicaciones Web
Finalmente el código para que funcione el filtro de productos por categoría seria:
Imports System.Data.SqlclientPublic 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 IfEnd Sub
Private Sub EnlaceReporte() With CrVProductos .ReportSource = Server.MapPath("RepProductos.rpt") .DataBind() End WithEnd SubPrivate 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 WithEnd 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 Categoría, respetando la sintaxis 'de Cristal Report {Tabla.Campo}=Valor StrFormula = "{Products.categoryid}=" & id 'Asignando nuestra formula CrVProductos.SelectionFormula = StrFormula
I.S.T.”Idat” 62 ASP.NET
Aplicaciones Web
'Volviendo a enlazar el origen de datos del reporte EnlaceReporte()End SubEnd Class
Finalmente el Reporte en ejecución al seleccionar una Categoría quedaria:
Web service
Los servicios Web XML se componen de dos partes: el punto de entrada al servicio Web XML y el
código 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 código de ensamblados precompilados, a un archivo de código subyacente o a un
código contenido en el propio archivo .asmx.
Nota Si el código está contenido directamente en el archivo .asmx, ASP.NET lo compilará bajo
petición en el servidor.
La directiva de procesamiento WebService situada en la parte superior del archivo .asmx
determina dónde se buscará la implementación del servicio Web XML. De forma predeterminada,
Visual Studio utiliza archivos de código 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 método Public para indicar que se desea exponer dicho
método como parte del servicio Web XML. También se pueden utilizar las propiedades de este
atributo para configurar aún más el comportamiento del método 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 aplicación y de sesión. De forma predeterminada, los servicios Web XML creados en
código administrado con Visual Studio se heredan de esta clase. El servicio Web XML se puede
heredar de esta clase para obtener acceso a objetos intrínsecos de ASP.NET, como Request y
Session.
I.S.T.”Idat” 64 ASP.NET
Aplicaciones Web
Aplicación .- Empleando la BDD universidad, realizar la siguiente consulta.-
Resultado Final:
Pasos para crear la aplicación
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
Controles:RequiredFieldValidatorConvierte el control de entrada asociado en un campo obligatorio.PropiedadesControltovalidate:Textbox1 (enlzar con el campo textbox1 del codigo)ErrorMessage:Campo ObligatorioValidationSummaryMuestra un resumen de todos los errores de validación en línea en una página Web, en un cuadro de mensaje o en ambos.
Aplicaciones Web
Create procedure sp_datos @cod as char(5)as select Nombre=Apealumno+', '+Nomalumno, Nomesp from alumno a inner join especialidad eon e.idesp=a.idesp where idalumno=@cod
b) para ver sus notas
Create procedure sp_nota@cod char(5)asselect c.Idcurso,Nomcurso,Exaparcial,exaFinal , promedio=str((exaparcial+2*exafinal )/3,4,1) from notas n inner join curso c on c.idcurso=n.idcursowhere 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.ServicesImports 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=(local)") Dim Cmd As New OleDbCommand() Dim Pm As OleDbParameter+ Código generado por el Diseñador 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 líneas y, a continuación, guarde y genere el proyecto. ' Para probar este servicio Web, compruebe que la página 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
I.S.T.”Idat” 69 ASP.NET
Hacer Clic derecho en References Agregar Referencia WebY copiar la dirección anterior:Como se muestra en la siguiente figura.
Paso 6.- Agregar los formularios de trabajo , por ejemplo WebForm1 es el diseño de la boleta de nota donde se hace referencia al Web_service , Webalumnos.- Para el mantenimiento de la tabla alumnos.
Aplicaciones Web
La codificación 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
+ Código generado por el Diseñador 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 código de usuario para inicializar la página 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 SubEnd Class
Aplicación 2.- seleccionando en un combo DropDwonList1 una especialidad llenado desde un
servicio , que muestre todos los alumnos de es aespecialidad.
Codificación
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
DropDownList1.- En propiedades establecerAutopostBack =Truetrue si se produce una devolución de exposición automática cundo el usuario cambia la selección de la lista; de lo contrario, false. Dgalumno (Dtagrid)Lbnro la Etiqueta
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
+" Código generado por el Diseñador 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 ‘ Si la pagina no ha sido cargada listar1() End If 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 código de este archivo y en la primera línea debemos agregar la clásica cadena que nos permita utilizar al proveedor de datos Sqlclient.
Imports System.Data.SqlClientImports 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
Luego debemos escribir el código que nos permita crear funciones y que nos devolvera los registros necesarios.
I.S.T.”Idat” 73 ASP.NET
Aplicaciones Web
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 parámetroDim odap As New SqlDataAdapter( _"select productid,productname,unitprice,categoryid " & _" from products where categoryid=@codigo order by productname", ocn)
‘Creando el parámetro que utiliza la consulta SELECT del Obj. DataAdapterodap.SelectCommand.Parameters.Add("@codigo", SqlDbType.Int).Value = codcat
odst = New DataSet()
‘Llenamos el Obj. Dataset, con el resultado de las filas del DataAdapterodap.Fill(odst)Return odstEnd Function
I.S.T.”Idat” 74 ASP.NET
Aplicaciones Web
<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 odstEnd 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 función el cual nos devuelve de acuerdo a los valores enviados un archivo en formato XML
Luego al final debemos ejecutar la aplicación (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 dirección 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 Aplicación Windows o una Aplicación Web
Aplicación Web
Creamos un nuevo Proyecto de Visual Basic de tipo de plantilla Aplicación Web ASP NET y le damos el nombre de: ClienteASPNet_WSNorthwind
Luego al formulario web le damos el nombre de WebCliente.aspx y su diseño será parecido a:
I.S.T.”Idat” 76 ASP.NET
Aplicaciones Web
Luego sobre el explorador de soluciones, ubicamos la carpeta REFERENCES y hacemos clic derecho y seleccionamos la opción Agregar Referencia Web …, en el cual ingresaremos la cadena URL del Servicio Web Anterior (WSNorthwind) en el texto de Dirección, y presionamos el botón que tiene el símbolo de la flecha (color verde), si encuentra el servicio este aparecerá en la columna de la izquierda todos los métodos web declarados, para lo cual lo único que necesitaremos es presionar el botón Agregar referencia
I.S.T.”Idat” 77 ASP.NET
Aplicaciones Web
Ahora solo quedaría ingresar el código respectivo, no olvidar verificar las siguientes propiedades:
Control Propiedad Valor DropDownListBox1 ID ddlcategorias
AutoPostBack True
Label1 Text Categories
Label2 ID lblcat
Datagrid1 ID dgdproductos
No olvidar darle un formato al Datagrid, para lo cual puede utilizar el formato Automático (clic
derecho sobre el datagrid), así como también establecer una paginación adecuada (clic derecho
sobre el datagrid y escoger Generador de Propiedades y ubicarse en la ficha Paginación), para el
ejemplo se ha escogido Permitir paginación, Tamaño de Pagina: 5, en Posición: Superior e
Inferior, en Modo: números de Pagina
Codigo del formulario Web
I.S.T.”Idat” 78 ASP.NET
Aplicaciones 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 código de usuario para inicializar la página 'Si la pagina se esta cargando por primera vez el codigo categoría 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 categoría seleccionada Call Cargar_Productos(xcat)End Sub
Sub Cargar_Categorias() 'Obteniendo el listado de categorías a través 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 WithEnd Sub
I.S.T.”Idat” 79 ASP.NET
Aplicaciones Web
Sub Cargar_Productos(ByVal cat As Integer = 0) 'si no se ha seleccionado ninguna categoría que liste todos los productos If cat = 0 Then odst = obj.Listar_Productos Else 'SI NO Listar solo los que pertenezcan a la categoría 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 categoría del objeto ddlcategorias xcat = CInt(ddlcategorias.SelectedItem.Value) lblcat.Text = xcat.ToString
'Almacenando el codigo de categoría 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_categoriasAsSelect * From categories Order By categorynameGo
Exec usp_lst_categoriasGo
ALGUNOS TRUCOS EN ASP .NET
Esta nota se centrará en responder algunas de las preguntas más frecuentes que surgen al
momento de comenzar a trabajar con ASP .NET.
I.S.T.”Idat” 81 ASP.NET
Aplicaciones Web
No se harán grandes explicaciones técnicas, sino más bien, mostraremos código para resolver
algunos de los problemas más comunes con los que nos encontramos al momento de escribir una
aplicación, por ejemplo, cómo enviar un mensaje, cómo subir un archivo, cómo escribir en el Visor
de Eventos o cómo escribir un contador de Performance.
Así que vamos directamente a los temas:
¿Cómo enviar correo electrónico por medio de ASP .NET?
En el namespace System.Web.Mail encontramos la clase necesaria para el envío 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 página ASP.NET realizamos en envío del correo:
' Importamos el namespaceImports System.Web.Mail
Public Class EnviarMailInherits System.Web.UI.PageProtected 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 línea creamos el objeto mensaje:
Dim Mensaje As New MailMessage()
Además, como también 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 opción es incluir también 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 continuación 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 línea a continuación se define el tipo del formato del cuerpo del mensaje, HTML o texto.
Mensaje.BodyFormat = MailFormat.HtmlMensaje.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 envía el mensaje.
SmtpMail.Send(Mensaje) Mensaje = Nothing oAttach = Nothing End SubEnd Class
¿Cómo 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 codificación multipart/form-data, veamos el ejemplo:
La primera parte se compone de la página 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 botón para confirmar el envío:
<asp:Button id="cmdEnviar" runat="server" Text="Enviar"></asp:Button></form>
Esta segunda parte comprende el código necesario para poder grabar el archivo enviado en el directorio correspondiente.
'Importamos System.IOImports System.IO
Public Class UploadInherits System.Web.UI.PageProtected WithEvents Mensaje As System.Web.UI.WebControls.LabelProtected WithEvents cmdEnviar As System.Web.UI.WebControls.ButtonProtected 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 anónimo 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>Tamaño: " & File1.PostedFile.ContentLength() & " bytes."
End Sub
¿Cómo escribir en el Visor de Eventos?
Una de la problemática más común, es la forma de como grabar información, ya sea de errores o
descripciones de eventos, etc. En Windows se cuenta con una herramienta, el Visor de Eventos,
que tiene varias características útiles como ser la posibilidad de hacer filtros por diferentes
condiciones o exportar esa información para ser tratada por otra herramienta.
Pero en general no se lo utiliza en los sistemas porque se mezcla con toda la información que
genera el propio sistema operativo, entonces muchas veces resulta confuso poder encontrar la
información que nos interesa.
En este ejemplo veremos de qué forma podemos crear una nueva sección 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 sección en el Visor de Eventos, en caso contrario es
creada:
'Creo la entrada si no existeIf Not System.Diagnostics.EventLog.SourceExists("MiFuente","NombreMaquina) ThenSystem.Diagnostics.EventLog.CreateEventSource("MiFuente", "NombreDelLog", "NombreMaquina")End If
I.S.T.”Idat” 84 ASP.NET
Aplicaciones Web
Importante: de acuerdo a la configuración de seguridad definida en la aplicación ASP.NET es
probable que un usuario anónimo o no tenga los permisos necesarios y no pueda ejecutar el
código necesario para crear la sección en el Visor de Eventos o escribir en él. Es conveniente
para crear la sección impersonar un usuario que si tenga esos permisos.
En este punto declaramos el objeto "log", definimos en que sección 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 información.
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 método WriteEntry permite diferentes alternativas, en este ejemplo hemos utilizado una de las
mas simples, pero se pueden ingresar otros parámetros como: categoría, Id del evento, etc.
Para finalizar con este punto, también se puede decir que hay un método
Log.Delete(NombreDeLog) que permite también borrar completamente una sección en el Visor
de Eventos.
¿Cómo crear un contador de Performance?
Una opción muy interesante es la de poder crear contadores para el Monitor de Performance y
actualizarlos de acuerdo a alguna particularidad que sea de interés. Por ejemplo, puede interesar
ver la carga que tiene una determinada página o un determinado componente.
En el ejemplo siguiente se verán cuáles son los pasos necesarios para realizar estas operaciones.
El PerformanceCounter se encuentra en el namespace System.Diagnotics.
Imports System.Diagnostics
Public Class PerfMonInherits 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 PerformanceCounterDim 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 categoría 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 operación. Una alternativa es la de tener
creado previamente el contador y la categoría.
'Creo la Categoría y el ContadorIf Not PerformanceCounterCategory.CounterExists(NombreContador, NombreCategoria) ThenPerformanceCounterCategory.Create(NombreCategoria, "Descripción de la categoría", _
NombreContador, "Descripción del Tipo de Contador")End If
Se abre el contador de una determinada Categoría, él ultimo parámetro (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
también 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 más preguntas generan, y también se
puede observar de que manera el Framework .NET ha facilitado estas tareas que en casos
anteriores eran complicadas de implementar y requería conocimientos profundos sobre el API de
Windows.
CÓMO CREAR Y LEER CONTROLES DINÁMICAMENTE EN ASP .NET
En este artículo se muestra como crear controles dinámicamente, almacenarlos en contenedores
de controles y posteriormente obtener la información que se ha ingresado en ellos.
En el ejemplo de este artículo se utilizan los controles de uso típico, cuando se lee información
de una base de datos. Estos controles son, en la mayoría de los casos, los botones radiales
(RadioButton), cajas de selección (CheckBox), cajas de texto (TextBox) y las listas de selección
(DropDownList).
I.S.T.”Idat” 86 ASP.NET
Aplicaciones Web
Además se utilizarán 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 codificación directa en la página ASPX, realizándose en código
subyacente (codebehind) de la página ASPX creada.
Mas información de código subyacente se puede encontrar en el artículo E303247.
Contenido
Cuando se necesita construir un editor de los valores almacenadas en
una base de datos, específicamente en una tabla, la cantidad de
registros contenidos en esta no es conocida de antemano. Por este mismo motivo, no se
puede diseñar una página con los controles creados con antelación, sino que deben ser creados
dinámicamente adecuándose a las necesidades.
Para el funcionamiento correcto, se utilizará la propiedad de almacenamiento de estado de los
controles. Se podrá encontrar más información de ésta propiedad en el documento Estado de los
controles de ASP.NET: Al rescate de los programadores.
Creación de controles
Los controles que se utilizarán en el ejemplo son los que tradicionalmente se encuentran en
cualquier página html, como las cajas de texto, botones radiales, listas de selección y cajas de
selección.
Estos controles serán 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 utilizarán como contenedores son las siguientes
Panel
PlaceHolder
Table con sus clases TableRow (fila) y TableCell (columna)
Al final del documento se encontrarán links a las definiciones de todos los controles utilizados en el ejercicio.
Representación 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 gráfico, alineamiento, estilos, etc. Para el PlaceHolder, las únicas
propiedades en tiempo de diseño son Visible y EnableViewState, ambas también 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 sólo es posible definir el orden dentro del contenedor, pero no una
posición específica en la página. Si se quiere un despliegue mas acabado, es recomendable la
utilización de tablas, definiendo las filas y columnas donde serán agregados los controles.
Para el Panel y el PlaceHolder, al momento de agregar un control a un contenedor, se utiliza la
función Add de la colección de controles Controls.
‘Los objetos objPanel y objPlaceHolder están creados en la página en tiempo de diseño
‘El objeto objControl, es cualquier tipo de control.
objPanel.Controls.Add(objControl)
objPlaceHolder.Controls.Add(objControl)
Adicionalmente a la función Add existe la función AddAt que permite agregar un control en
alguna posición 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 definición, una tabla esta compuesta por una o muchas filas y cada fila esta
compuesta por una o muchas celdas.
La inserción de controles en una tabla se realiza a través de la función Add de la colección de
controles Controls de la celda.
I.S.T.”Idat” 88 ASP.NET
Aplicaciones Web
‘El objeto objTable está creado en la página aspx en tiempo de diseño.
‘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 página
Adicionalmente a la función Add existe la función AddAt que permite agregar un control en
alguna posición en especial dentro del contenedor.
objCell.Controls.AddAt(intPos, objControl)
En la práctica
La aplicación constará de dos formularios, el primero con controles de texto y listas de selección,
y el segundo con botones radiales y cajas de selección.
Para esto es necesario iniciar una aplicación de tipo ASP.NET Web Application.
I.S.T.”Idat” 89 ASP.NET
Aplicaciones Web
Una vez creada la aplicación, se puede utilizar el archivo WebForm1.aspx creado inicialmente o generar otro con la opción 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 edición de los valores desde una tabla de categorías,
permitiendo modificar el nombre de la categoría y el acceso. El nombre se escribirá en campos de
texto y el tipo de acceso en listas de selección.
Después 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 página son los siguientes:
Tabla ASPX donde se almacenarán los controles dinámicos (representada por ###)
Botón Jerarquía
Botón Form.Keys
Label de despliegue del resultado de la grabación
Se utilizarán dos botones ya que se mostrarán dos formas de recorrer los controles de una
página. La de jerarquía corresponde a la navegación a través de los controles anidados y la de las
llaves (keys), de la colección request.form.
Si bien no existe una jerarquía real de controles, estos se pueden recorrer como si así fuera, ya
que dentro de la página hay un formulario, dentro del formulario están la tabla aspx y los botones.
A su vez, dentro de la tabla aspx existen las filas y dentro de cada fila están las celdas. Por último,
en las celdas están los controles de texto y listas de selección.
Creación 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 código para lograr esto se
muestra en las siguientes secciones de código, separadas por partes. A todo control que se
quiera identificar después 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. categoría"objRow.Cells.Add(objCell)
objCell = New TableCell()objCell.Text = "Nombre categoría"objRow.Cells.Add(objCell)
objCell = New TableCell()objCell.Text = "Utilización"objRow.Cells.Add(objCell)
tblCategorias.Rows.Add(objRow)
La tabla tblCategorias está creada en tiempo de diseño. En este código, se crea el encabezado de
ésta. Primero se crea la fila de la tabla con la instrucción New TableRow(), después se crea cada
celda con la instrucción 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 instrucción tblCategorias.Rows.Add(objRow).
Para la creación de las filas y columnas con la información, se utiliza un DataReader (almacenado
en objRs) de una base de datos en Access. El ciclo que crea las demás 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 información extraída de la base de datos, está en tres columnas.
codigo : identifica a la categoría
I.S.T.”Idat” 94 ASP.NET
Aplicaciones Web
descripcion : la descripción misma de la categoría
acceso : el acceso a ésta (privado, público y ambos)
La página que se construye es de la siguiente forma:
El código de la categoría es desplegado en la primera columna, el texto en la segunda y por
último, en la tercera se genera una lista de selección con las distintas opciones de acceso. En la
base de datos, el valor almacenado del acceso es 1, 2 ó 3 para las opciones Pública, Privada o
Ambas, respectivamente.
Como se mencionó antes, cuando el usuario presione grabar, es necesario identificar los
controles individualmente. Por esta razón 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 código
de la categoría en la base de datos. Para las listas de selección, el nombre asignado es "acceso-"
& codigo. Si se observa el código origen de la página 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 crearán la misma
cantidad de cajas de texto y listas de selección, con los nombres acceso-1 hasta acceso-N y
categ-1 hasta categ-N.
Lectura de los controles utilizando la jerarquía de navegación.
Al presionar el botón jerarquía, se graban los valores en la tabla, produciéndose el siguiente
resultado:
I.S.T.”Idat” 96 ASP.NET
Aplicaciones Web
El código del botón jerarquía 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 LongDim objCeldaDescripcion As TableCellDim objCeldaAcceso As TableCell
Dim objDescripcion As TextBox
Dim objAcceso As DropDownListDim 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., Descripción y Acceso, desde la número 1 ya están los textboxs
For i = 1 To tblCategorias.Rows.Count – 1'la celda 0 es la del ID, la 1 la de la descripción y la
2 del accesoobjCeldaDescripcion = 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 tablaobjDescripcion = objCeldaDescripcion.Controls(0)objAcceso = objCeldaAcceso.Controls(0)
If Left(objDescripcion.ID, 5) = "categ" ThenstrNombre = objDescripcion.TextlngCodigo = CLng(Split(objDescripcion.ID,
"-").GetValue(1))lngAcceso = objAcceso.SelectedItem.ValueGrabarCategoria(lngCodigo, strNombre, lngAcceso)
End If
Next
End Sub
En el evento del botón se realiza un ciclo por todas las filas de la tabla tblCategorias, creada en
tiempo de diseño. Se comienza de la fila 1 ya que en la 0 están los textos de encabezado de la
tabla. El ciclo termina naturalmente en Count-1.
En cada ciclo se obtienen las celdas donde están los controles. Con la instrucción
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 también comienzan desde 0 y
van hasta Count-1, pero como en la primera está el id de la categoría, 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
I.S.T.”Idat” 98 ASP.NET
Aplicaciones Web
2 y 3 (con el nombre y el acceso). Sólo se deben buscar los controles dentro de cada celda para
obtener lo que el usuario ha ingresado.
El primer control es el número 0 (y se sabe que no hay más), que se carga en objDescripcion,
variable de tipo TextBox, con la instrucción objDescripcion = objCeldaDescripcion.Controls(0).
Lo mismo se hace para la lista de selección de accesos, con la instrucción objAcceso =
objCeldaAcceso.Controls(0).
Ya se tiene entonces los controles donde el usuario hizo los cambios. Ahora, se debe identificar a
que categoría corresponde. El identificador de la categoría se había almacenado junto al nombre
de la caja de texto y de la lista de selección con el formato "categ-" & codigo, en la propiedad ID.
Entonces, en la variable lngCodigo se almacena el código de la categoría. Para esto, se utiliza la
instrucción lngCodigo = CLng(Split(objDescripcion.ID, "-").GetValue(1)). Lo que hace esta
línea es mas simple de lo que aparenta. El la propiedad ID de objDescripcion está el texto con
"categ-1". Con la función Split, se divide una frase o palabra, con algún carácter. En este caso, el
carácter es "-"., y al dividir “categ-1” con “-“, se generan 2 palabras. Una es “categ” y la otra es “1”.
Con la instrucción GetValue se obtiene la palabra deseada, siendo 0 la primera (“categ”) y 1 la
segunda (“1”). Finalizando, la palabra “1” es convertida en un número Long y almacenada en la
variable lngCodigo. Obviamente, en cada iteración del For, irá cambiando el valor de la segunda
palabra del Split, con el número del identificador de la categoría.
Anteriormente se había almacenado en la variable strNombre el texto de la descripción. En la
variable lngAcceso se carga el valor de la selección que ha hecho el usuario con respecto al
acceso de la categoría.
Por último, se llama a una función GrabarCategoria, que graba los valores en la base de datos.
Lectura de los controles utilizando la colección request.form.keys.
Al presionar el botón form.keys, se graban los valores en la tabla, produciéndose el siguiente
resultado:
I.S.T.”Idat” 99 ASP.NET
Aplicaciones Web
El código del botón Form.Keys es el siguiente, bastante más 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 colección Keys del objeto Request.Form, no se pueden
obtener los controles, sino que la información 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 página al momento de presionar el botón 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 código de la categoría, con la instrucción lngCodigo = CLng(Split(objKey,
"-").GetValue(1)). La explicación de esta línea es idéntica al caso anterior.
Posteriormente se almacena en la variable strNombre el texto de la descripción. 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 selección que ha hecho el usuario con respecto al
acceso de la categoría, utilizando también Request.Form, pero solicitando el campo “acceso-“ y el
código de la categoría, 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 función GrabarCategoria, que graba los valores en la base de datos.
I.S.T.”Idat” 101 ASP.NET
Aplicaciones Web
A continuación se utilizarán cajas de selección y botones radiales. Para esos casos, es casi
trasparente el uso para el programador.
Segundo Formulario
En el segundo formulario se permitirá la selección de los valores de la tabla de categorías, en
listas de selección y botones radiales.
Después de ingresar los controles, la pantalla de pruebas quedará de la siguiente forma:
Los controles creados en esta página son los siguientes:
CheckBoxList para la lista de cajas de selección
RadioButtonList para la lista de botones radiales
Botón Aceptar que despliega las selecciones del usuario
Label de despliegue del resultado de la selección
Creación 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 código para lograr esto se despliega a continuación. 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 están pobladas. El resultado de esto se despliega en la siguiente pantalla:
Se pueden hacer algunas selecciones y presionar el botón Aceptar.
I.S.T.”Idat” 103 ASP.NET
Aplicaciones Web
El código detrás del botón 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 NINGÚN ÍTEM"
End Try
Para la lista de cajas de selección se debe recorrer verificando si cada elemento está o no
seleccionado. Al igual que los demás 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 categoría, Text con el nombre de la categoría y
Selected, que retorna verdadero o falso si está seleccionado. ListItem tiene una gran cantidad de
propiedades, pero sólo se han destacado las necesarias en este caso.
Durante el ciclo, se comprueba que esté seleccionada, y en caso positivo, se obtiene el código y
el nombre.
Para los botones radiales, es mas simple aún, pero se debe tener en cuenta un condición
especial.
El elemento seleccionado de la lista radial se almacena en radList.SelectedItem. Si no hay
ningún elemento seleccionado, lo anterior es NULO y se genera un error si se trata de acceder
directamente. En caso que haya algún elemento seleccionado, tanto el identificador como el
nombre de la categoría 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 excepción sea por error de NULO (NullReferenceException).
Conclusiones
La utilización de controles dinámicos permite construir pantallas más 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 utilización se ha simplificado
al máximo. Con algunas líneas de código se pueden crear y leer los controles rápidamente.
Para las listas de selección y cajas de texto, se complica el funcionamiento. Existen varias formas
de hacer lo mismo del primer formulario, de diversa complejidad, y la opción queda abierta al
programador a encontrar la forma que más le acomode a su trabajo. A su vez, la lectura de los
controles, las opciones presentadas son las más utilizadas, pudiendo encontrar algunas variantes
sobre la segunda. Ambas tienen sus ventajas y desventajas.
La jerarquía de controles es más 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 algún otro control con el nombre “categorías”, por ejemplo, al aplicar la función 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 más le acomode, o buscar variaciones
de estas.
Referencias
Las definiciones de los controles (en inglés) se pueden encontrar en los siguientes artículos
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, métodos y definiciones (en inglés)
Try…Catch…Finally Statements Split Function GetValue Method
VIII BIBLIOGRAFÍA: CHARTE Francisco Programación con Visual Net
Edit. ANAYA España 2001
I.S.T.”Idat” 106 ASP.NET
Aplicaciones Web
CHARTE Francisco Programación con Visual Net (Programación de Bases de Datos )
Edit. ANAYA España 2002
EVANGELUS Petroulsos Visual Basic Net Editorial Anaya, Madrid 2002
MICROSOFT Manual del Programador 6.0 Editorial Mac Graw Hill México 1999
CEVALLOS fco. Javier Programación Visual Basic 6.0 Editorial Rama Madrid 2000
Direcciones Web
http://www.godot.net http://www.manualesgratis.comhttp://www.microsoft.comhttp://www.microsoft.com/spanish/msdn/articulos/archivo/040403/voices/treeview.asp#TreeView_Referenceshttp://www.microsoft.eshttp://www.guille.costasol.nethttp://www.programacion.net/cursoshttp://www.willydev.net/DesktopDefault.Aspxhttp://es.gotdotnet.com/quickstart/aspplus/doc/ecommerceapp.aspxhttp://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art185.asp
I.S.T.”Idat” 107 ASP.NET