You are on page 1of 380

Tutorial 1: Creacin de una capa de acceso de datos

C#SHARP Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_1_CS.exe cdigo de ejemplo.


Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_1_CS.exe.

Contenido del Tutorial 1 (Visual C #) Introduccin Paso 1: Crear un proyecto Web y conexin a la base de datos Paso 2: Creacin de la capa de acceso a los datos Paso 3: Agregar los mtodos con parmetros de la capa de acceso de datos Paso 4: Actualizar, insertar y eliminar datos Paso 5: Completar el nivel de acceso a datos resumen

Introduccin
Como desarrolladores web, nuestras vidas giran en torno a trabajar con datos. Creamos las bases de datos para almacenar los datos, el cdigo para recuperar y modificar, y las pginas web para recopilar y resumir la misma. Este es el primer tutorial de una serie larga que va a explorar tcnicas para implementar estos patrones comunes en ASP.NET 2.0. Vamos a empezar con la creacin de unaarquitectura de software compuesto por una capa de acceso a datos (DAL), utilizando conjuntos de datos con tipo, una capa de lgica empresarial (BLL) que hace cumplir las reglas de negocio personalizadas, y una capa de presentacin compuesta por pginas ASP.NET que comparten una pgina comn diseo. Una vez que esta base backend se ha establecido, vamos a pasar a la presentacin de informes, que muestra cmo mostrar, resumir, recopilar y validar datos de una aplicacin web. Estos tutoriales estn orientados a ser conciso y ofrecen instrucciones paso a paso las instrucciones con un montn de capturas de pantalla que le guiar a travs del proceso visual. Cada tutorial est disponible en C # y Visual Basic y incluye una descarga del cdigo completo usado. (Este primer tutorial es bastante largo, pero el resto se presentan en trozos mucho ms digerible.)

Para estos tutoriales vamos a utilizar un Microsoft SQL Server 2005 Express Edition versin de la base de datos Neptuno situado en elApp_Data directorio. Adems de los archivos de base de datos, el App_Data carpeta tambin contiene los scripts de SQL para crear la base de datos, en caso de que desee utilizar una versin de base de datos diferente. Estos scripts pueden tambin ser descargadas directamente desde Microsoft , si usted prefiere. Si utiliza una versin diferente de SQL Server de la base de datos Northwind, usted tendr que actualizar la NORTHWNDConnectionString configuracin de la aplicacin de Web.config archivo. La aplicacin web ha sido desarrollado usando Visual Studio 2005 Professional Edition como sistema de archivos basado en proyecto de sitio Web. Sin embargo, todos los tutoriales funcionan igual de bien con la versin gratuita de Visual Studio 2005, Visual Web Developerhttp: / / msdn.microsoft.com / vstudio / express / vwd /. En este tutorial vamos a empezar desde el principio y crear la capa de acceso a datos (DAL), seguido por la creacin de la capa de lgica empresarial (BLL) en la segunda tutora, y trabajando en el diseo de pgina y la navegacin en el tercero. Los tutoriales despus de la tercera se basar en los fundamentos establecidos en los tres primeros. Tenemos mucho que cubrir en este primer tutorial, as que dispara a Visual Studio y vamos a empezar!

Paso 1: Crear un proyecto Web y conexin a la base de datos


Antes de que podamos crear nuestra capa de acceso a datos (DAL), primero tenemos que crear un sitio web y la configuracin de nuestra base de datos. Comience por crear un sistema de archivos basado en nuevo sitio web ASP.NET. Para lograr esto, vaya al men Archivo y seleccione Nuevo sitio web, mostrando el nuevo sitio Web cuadro de dilogo. Elija la plantilla Sitio Web ASP.NET, establezca la ubicacin de la lista desplegable Sistema de archivos, elija una carpeta para colocar el sitio web, y configurar el idioma de C #.

Figura 1. Crear un nuevo archivo basado en el sistema del sitio Web

Esto crear un nuevo sitio web con un Default.aspx pgina ASP.NET y un App_Data carpeta. Con el sitio web creado, el siguiente paso es agregar una referencia a la base de datos en el Explorador de servidores de Visual Studio.Mediante la adicin de una base de datos para el Explorador de servidores puede agregar tablas, procedimientos almacenados, vistas, etc, todo ello desde Visual Studio. Tambin puede ver los datos de la tabla o crear sus propias consultas ya sea a mano o grficamente a travs del Generador de consultas. Adems, cuando construimos los conjuntos de datos con tipo para el DAL tendremos que punto de Visual Studio para la base de datos de los que los conjuntos de datos con tipo se debe construir. A pesar de que puede proporcionar esta informacin de conexin en ese punto en el tiempo, Visual Studio rellena automticamente una lista desplegable de las bases de datos ya registrados en el Explorador de servidores. Los pasos para agregar la base de datos Northwind al Explorador de servidores depender de si desea utilizar el servidor SQL Server 2005 Express Edition de base de datos en el App_Data carpeta o si tiene un Microsoft SQL Server 2000 o 2005, la configuracin del servidor de base de datos que desea utilizar en su lugar.

Utilizando una base de datos en el

App_Data

Carpeta

Si usted no tiene un servidor SQL Server 2000 o Server 2005 de base de datos para conectarse a, o simplemente quieres evitar tener que aadir la base de datos a un servidor de base de datos, puede utilizar el SQL Server 2005 Express Edition versin de la base de datos Neptuno que se encuentra en el sitio web de descarga de App_Data carpeta ( northwnd.mdf ). Una base de datos colocados en el App_Data carpeta se agregan automticamente a la del Explorador de servidores. Asumiendo que tiene SQL Server 2005 Express Edition instalado en su mquina usted debe ver a un nodo llamado northwnd.mdf en el Explorador de servidores, que se puede expandir y explorar sus tablas, vistas, procedimientos almacenados, y as sucesivamente (ver Figura 2). El App_Data carpeta tambin puede tener Microsoft Access . mdb archivos, que, al igual que sus homlogos de SQL Server, se agregan automticamente a la del Explorador de servidores. Si no desea utilizar cualquiera de las opciones de SQL Server, siempre se puededescargar una versin de Microsoft Access del archivo de base de datos Northwind y caer en el App_Data directorio. Tenga en cuenta, sin embargo, que las bases de datos de acceso no son tan caractersticas como las de SQL Server, y no estn diseados para ser utilizados en los escenarios del sitio web. Adems, un par de los 35 + tutoriales utilizar cierto nivel de base de datos de caractersticas que no son compatibles con el acceso.

Conexin a la base de datos en un servidor de Microsoft SQL Server 2000 o 2005 Server base de datos
Alternativamente, usted puede conectarse a una base de datos Neptuno instalada en un servidor de base de datos. Si el servidor de base de datos no tiene ya la base de datos Northwind instalado, primero debe agregar el servidor de base de datos ejecutando el script de instalacin incluido en la descarga de este tutorial o por la descarga de la versin SQL Server 2000 de Neptuno y el script de instalacin directamente desde el sitio Web de Microsoft.

Una vez que haya instalado la base de datos, vaya al Explorador de servidores en Visual Studio, haga clic en el nodo Conexiones de datos y seleccione Agregar conexin. Si no ve el Explorador de servidores vaya al Explorador de Vista / Server, o pulse Ctrl + Alt + S.Con ello se abre el cuadro de dilogo Agregar conexin, en el que puede especificar el servidor para conectarse a la informacin de autenticacin y el nombre de base de datos. Una vez que haya configurado correctamente la informacin de conexin de base de datos y hacer clic en el botn Aceptar, la base de datos se agrega como un nodo bajo el nodo Conexiones de datos. Puede expandir el nodo de base de datos para explorar sus tablas, vistas, procedimientos almacenados, y as sucesivamente.

Figura 2. Agregar una conexin de base de datos del servidor de bases de datos de Northwind

Paso 2: Creacin de la capa de acceso a datos


Cuando se trabaja con datos de una opcin es integrar la lgica de los datos especficos directamente en la capa de presentacin (en una aplicacin web, las pginas ASP.NET representan la capa de presentacin). Esto puede tomar la forma de escribir cdigo de ADO.NET en la parte de cdigo de la pgina ASP.NET o mediante el control SqlDataSource de la porcin de marcado. En cualquier caso, este enfoque fuertemente a las parejas la lgica de acceso a datos con la capa de presentacin. Lo que se recomienda, sin embargo, es separar la lgica de acceso a los datos de la capa de presentacin. Esta capa separada se conoce como la capa de acceso a datos, DAL, para abreviar, y normalmente se implementa como un proyecto de bibliotecas de clase independiente. Los beneficios de esta arquitectura en capas estn bien documentadas (ver "Otras lecturas", al final de este tutorial para obtener informacin sobre estas ventajas) y es el enfoque que tendr en esta serie.

Todo el cdigo que es especfico para el origen de datos subyacente - como la creacin de una conexin a la base de datos, la emisin de SELECCIONAR , INSERTAR , ACTUALIZAR y ELIMINAR comandos, etc - deben estar ubicados en el DAL. La capa de presentacin no debe contener ninguna referencia a dicho cdigo de acceso de datos, sino que debe hacer llamadas a la DAL para cualquier y todos los datos solicitados. Las capas de acceso a datos normalmente contienen mtodos para acceder a los datos de base de datos subyacente.La base de datos Northwind, por ejemplo, tiene Productos y Categoras tablas que registran los productos para la venta y las categoras a las que pertenecen. En nuestro DAL tendremos mtodos como:
GetCategories (), que devuelven informacin acerca de todas las categoras GetProducts () , que devuelve informacin sobre todos los productos GetProductsByCategoryID ( IdCategora ) , que devolver todos los productos que

pertenecen a una categora particular

GetProductByProductID ( productID )

, que devuelve informacin sobre un producto en

Estos mtodos, cuando se invoca, se conectar a la base de datos, ejecutar la consulta de su caso, y devolver los resultados. Cmo podemos devolver estos resultados es importante. Estos mtodos slo puede devolver un DataSet o DataReader poblada por la consulta de bases de datos, pero los resultados idealmente estos deben ser devueltos con los objetos con establecimiento inflexible . Un objeto con establecimiento inflexible es aquel cuyo esquema est rgidamente definido en tiempo de compilacin, mientras que lo contrario, un objeto dbilmente escrito, es un esquema que no se conoce hasta el tiempo de ejecucin. Por ejemplo, el DataReader y DataSet (por defecto) son objetos vagamente escrito, ya que su esquema est definido por las columnas devueltas por la consulta de base de datos utilizada para poblarlas. Para acceder a una columna en particular a partir de una vagamente escrito DataTable tenemos que utilizar una sintaxis como: DataTable filas [. ndice ] [" columnName "] . Escribir suelta el DataTable en este ejemplo se demuestra por el hecho de que tenemos que acceder a nombre de la columna mediante una cadena o un ndice ordinal. Un establecimiento inflexible de tipos DataTable, por el contrario, tendr cada una de sus columnas implementan como propiedades, lo que resulta en el cdigo que se ve as: DataTable . Filas [ ndice ]. columnName . Para devolver los objetos con establecimiento inflexible, los desarrolladores pueden crear sus propios objetos de negocio personalizados o utilizar conjuntos de datos con tipo. Un objeto de negocio se lleva a cabo por el promotor como una clase cuyas propiedades suelen reflejar las columnas de la tabla de base de datos subyacente del objeto de negocio representa. Un DataSet es una clase generada para usted por Visual Studio basado en un esquema de base de datos y cuyos miembros son de tipado fuerte de acuerdo con este esquema. El DataSet se compone de clases que extienden el conjunto de datos ADO.NET, DataTable, DataRow y clases. Adems de las tablas de datos con establecimiento inflexible, conjuntos de datos con tipo ahora tambin incluyen TableAdapters, que son clases con mtodos para llenar el conjunto de datos de tablas de datos y la propagacin de las modificaciones en la tablas de datos de vuelta a la base de datos. Nota Para obtener ms informacin sobre las ventajas y desventajas del uso de conjuntos de datos con tipo en comparacin con los objetos de negocio personalizados, consulte Diseo de componentes de niveles y traspaso de datos a travs de stos .

Vamos a utilizar conjuntos de datos con establecimiento inflexible de la arquitectura estos tutoriales. La Figura 3 muestra el flujo de trabajo entre las diferentes capas de una aplicacin que utiliza conjuntos de datos con tipo.

Figura 3. Todos los datos de Cdigo de Acceso es relegado a la DAL

Creacin de un DataSet con tipo y el adaptador de la tabla


Para empezar a crear nuestra DAL, se inicia mediante la adicin de un DataSet a nuestro proyecto. Para lograr esto, haga clic derecho en el nodo del proyecto en el Explorador de soluciones y seleccione Agregar nuevo elemento. Seleccione la opcin de conjunto de datos de la lista de plantillas y el nombre de Northwind.xsd .

Figura 4. Optar por aadir un nuevo conjunto de su proyecto Despus de hacer clic en Agregar, cuando se le pide que agregue el conjunto de datos a la App_Code carpeta, seleccione Si. El Diseador de DataSet se mostrar, y el Asistente para la configuracin de TableAdapter se inicia, lo que le permite aadir su TableAdapter primero en el DataSet.

Un DataSet sirve como una coleccin con establecimiento inflexible de datos, sino que se compone de instancias de DataTable inflexible de tipos, cada uno de los cuales a su vez se compone de casos DataRow inflexible de tipos. Vamos a crear un establecimiento inflexible de tipos DataTable para cada una de las tablas de base de datos subyacente que tenemos que trabajar en esta serie de tutoriales.Vamos a empezar con la creacin de un DataTable para los productos de mesa. Tenga en cuenta que DataTables inflexible de tipos no incluyen ninguna informacin sobre cmo acceder a los datos de la tabla de base de datos subyacente. Con el fin de recuperar los datos para llenar el DataTable, se utiliza una clase TableAdapter, que funciona como nuestra capa de acceso a datos. Para nuestros productos DataTable, TableAdapter contendr los mtodos - GetProducts () ,GetProductByCategoryID ( IdCategora ) , y as sucesivamente - que vamos a invocar a partir de la capa de presentacin. El papel del DataTable es la de servir como objetos con establecimiento inflexible utiliza para pasar datos entre las capas. El Asistente para la configuracin de TableAdapter comienza le pedir que seleccione qu base de datos para trabajar. La lista desplegable muestra las bases de datos en el Explorador de servidores. Si no aadir la base de datos Northwind al Explorador de servidores, puede hacer clic en el botn Nueva conexin en este momento para hacerlo.

Figura 5. Elegir la base de datos Northwind de la lista desplegable Despus de seleccionar la base de datos y hacer clic en Siguiente, se le pedir si desea guardar la cadena de conexin en elWeb.config archivo. Al guardar la cadena de conexin que va a evitar tener que codificado en las clases TableAdapter, lo que simplifica las cosas, si los cambios de cadena de conexin la informacin en el futuro. Si opta por guardar la

cadena de conexin en el archivo de configuracin que es colocado en el <connectionStrings> seccin, que puede ser opcionalmente encriptada para mayor seguridad o modificas fuera de plazo a travs de la nueva pgina de ASP.NET 2.0 en propiedad de la herramienta de interfaz grfica de administracin de IIS, que es ms ideal para los administradores.

Figura 6. Guardar la cadena de conexin en Web.config A continuacin, tenemos que definir el esquema de la primera DataTable con establecimiento inflexible y dar el primer mtodo para nuestro TableAdapter utilizar al rellenar el DataSet con tipos declarados. Estos dos pasos se llevan a cabo de forma simultnea mediante la creacin de una consulta que devuelve las columnas de la tabla que queremos que se refleja en nuestro DataTable. Al final del asistente le daremos un nombre de mtodo para esta consulta. Una vez que se ha logrado, este mtodo puede ser invocado desde nuestra capa de presentacin. El mtodo se ejecutar la consulta definida y rellenar un DataTable con establecimiento inflexible. Para empezar a definir la consulta SQL, primero debemos indicar cmo queremos que el TableAdapter que ejecutar la consulta.Podemos utilizar una sentencia SQL ad-hoc, crear un nuevo procedimiento almacenado, o utilizar un procedimiento almacenado existente. Para estos tutoriales vamos a utilizar ad-hoc sentencias SQL. Se refieren a Brian Noyes artculo, construir una capa de acceso a datos con el Diseador de DataSet de Visual Studio 2005 para ver un ejemplo del uso de procedimientos almacenados.

Figura 7. Consulta de los datos mediante una declaracin ad hoc de SQL En este punto se puede escribir en la consulta SQL a mano. Cuando se crea el primer mtodo en el TableAdapter que normalmente queremos tener el retorno consulta las columnas que deben ser expresados en la correspondiente DataTable. Podemos lograr esto mediante la creacin de una consulta que devuelve todas las columnas y todas las filas de los Productos de la tabla:

Figura 8. Introduzca la consulta SQL en el cuadro de texto Como alternativa, utilice el Generador de consultas y grficamente la construccin de la consulta, como se muestra en la Figura 9.

Figura 9. Crear la consulta de forma grfica, a travs del Editor de consultas Despus de crear la consulta, pero antes de pasar a la siguiente pantalla, haga clic en el botn Opciones avanzadas. En proyectos de sitio web, "Generar instrucciones Insert, Update y Delete" es la nica opcin avanzada seleccionada por defecto, si se ejecuta este asistente desde una biblioteca de clases o un proyecto de Windows la opcin "Usar concurrencia optimista" opcin tambin sern seleccionados. Deja la opcin "Usar concurrencia optimista" opcin desactivada por el momento. Vamos a examinar la concurrencia optimista en futuros tutoriales.

Figura 10. Seleccione slo la opcin "Generar instrucciones Insert, Update y Delete" Opcin Despus de verificar las opciones avanzadas, haga clic en Siguiente para pasar a la pantalla final. Aqu se nos pide que seleccione cules son los mtodos para agregar a la TableAdapter. Hay dos modelos para rellenar los datos:

Llenar un DataTable - con este mtodo es un mtodo que se cre en un DataTable como parmetro, que se llena basndose en los resultados de la consulta. La clase DataAdapter de ADO.NET, por ejemplo, implementa este modelo con su relleno ()mtodo. Devuelve una DataTable - con este enfoque, el mtodo crea y llena el DataTable para usted y lo devuelve como el valor de retorno mtodos.

Usted puede tener el TableAdapter implementar uno o ambos de estos patrones. Tambin puede cambiar el nombre de los mtodos establecidos aqu. Vamos a dejar las dos casillas marcada, a pesar de que slo va a utilizar el patrn de esta ltima a travs de estos tutoriales. Adems, vamos a cambiar el nombre del lugar genrico GetData mtodo para GetProducts . Si est activada, la casilla final, "GenerateDBDirectMethods," crea Insert () , Update () y Delete () los mtodos de TableAdapter. Si deja esta opcin sin marcar, todas las actualizaciones se deben hacer a travs del TableAdapter nico Update () mtodo, que tiene en el DataSet, DataTable, un nico objeto DataRow o una matriz de objetos DataRow. (Si ha desactivado la "Generar instrucciones Insert, Update y Delete" desde las propiedades avanzadas en la Figura 9 establecimiento de esta casilla no tendr ningn efecto.) Vamos a dejar esta casilla seleccionada.

Figura 11. Cambiar el nombre del mtodo de GetData para GetProducts Complete el asistente, haga clic en Finalizar. Despus se cierra el asistente que se devuelven al Diseador de DataSet, lo que demuestra la DataTable que acabamos de crear. Usted puede ver la lista de columnas de la Productos DataTable ( ProductID , ProductName , y as sucesivamente), as como los mtodos de la ProductsTableAdapter ( Fill () y GetProducts () ).

Figura 12. Los productos de DataTable y ProductsTableAdapter se han aadido al conjunto de datos con tipo En este momento tenemos un DataSet con un solo DataTable ( Northwind.Products ) y una clase DataAdapter inflexible de tipos (NorthwindTableAdapters.ProductsTableAdapter ) con un GetProducts () mtodo. Estos objetos se pueden utilizar para acceder a una lista de todos los productos de cdigo como:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter (); Northwind.ProductsDataTable productos; productos productsAdapter.GetProducts = (); foreach (Northwind.ProductsRow productRow en los productos) Response.Write ("del producto:" + + productRow.ProductName "<br />");

Este cdigo no nos obligan a escribir un poco de acceder a los datos especficos del cdigo. No tuvimos que crear una instancia de las clases ADO.NET, no tiene que referirse a cualquier tipo de cadena de conexin, las consultas SQL o procedimientos almacenados. En cambio, el TableAdapter proporciona el cdigo de bajo nivel de acceso de datos para nosotros.

Cada objeto que se utiliza en este ejemplo es tambin inflexible de tipos, lo que permite que Visual Studio proporciona IntelliSense y en tiempo de compilacin comprobacin de tipos. Y lo mejor de todas las tablas de datos devueltos por el TableAdapter se puede enlazar a datos de ASP.NET Controles Web, tales como los controles GridView, DetailsView, DropDownList, CheckBoxList, y varios otros. El siguiente ejemplo ilustra la unin DataTable devuelto por el GetProducts () mtodo a un GridView en tan slo unos escasos tres lneas de cdigo en el Page_Load controlador de eventos. AllProducts.aspx
<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "AllProducts.aspx.cs" Inherits = "todosProductos"%> <DOCTYPE html PUBLIC "- / / W3C / / DTD XHTML 1.0 Transitional / / EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title> Ver todos los productos en un GridView </ title> <link rel="stylesheet" href="Styles.css" type="text/css" /> </ Head> <body> <form id="Form1" runat="server"> <div <h1> Todos los productos </ h1> <p> <asp:GridView ID="GridView1" runat="server" CssClass="DataWebControlStyle"> <HeaderStyle CssClass="HeaderStyle" /> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> </ Asp: GridView> </ P> </ Div> </ Form> </ Body> </ Html>

AllProducts.aspx.cs
using System; using System.Data; utilizando System.Configuration; using System.Collections; using System.Web; using System.Web.Security; utilizando System.Web.UI; utilizando System.Web.UI.WebControls; utilizando System.Web.UI.WebControls.WebParts; utilizando System.Web.UI.HtmlControls; utilizando NorthwindTableAdapters; pblica todosProductos clase parcial: System.Web.UI.Page { protected void Page_Load (object sender, EventArgs e) { ProductsTableAdapter productsAdapter = new ProductsTableAdapter (); GridView1.DataSource productsAdapter.GetProducts = (); GridView1.DataBind (); }

Figura 13. La lista de los productos se muestra en un GridView Aunque este ejemplo requiere que escribir tres lneas de cdigo en nuestra pgina de ASP.NET Page_Load controlador de eventos, en futuros tutoriales vamos a examinar cmo usar el ObjectDataSource para recuperar los datos de forma declarativa de la DAL. Con el ObjectDataSource que no tendr que escribir ningn cdigo y obtener el apoyo de paginacin y la clasificacin tambin!

Paso 3: Agregar los mtodos con parmetros de la capa de acceso a datos


En este punto ProductsTableAdapter clase tiene un solo mtodo, GetProducts () , que devuelve todos los productos en la base de datos. Si bien es capaz de trabajar con todos los productos es, sin duda til, hay veces en que vamos a querer recuperar informacin sobre un producto especfico, o todos los productos que pertenecen a una categora particular. Para agregar esta funcionalidad a nuestro nivel de acceso a los datos que podemos aadir los mtodos con parmetros para el TableAdapter. Vamos a aadir el GetProductsByCategoryID ( IdCategora ) mtodo. Para agregar un nuevo mtodo para la DAL, volver al Diseador de DataSet, haga clic en el ProductsTableAdapter seccin y elija Agregar consulta.

Figura 14. Haga clic con el TableAdapter y elegir Agregar consulta En primer lugar nos pregunte si queremos acceder a la base de datos usando un ad-hoc instruccin SQL o un procedimiento nuevo o ya existente almacenadas. Vamos a optar por utilizar una sentencia SQL ad-hoc de nuevo. A continuacin, se nos pregunta qu tipo de consulta SQL que nos gustara utilizar. Debido a que desea devolver todos los productos que pertenecen a una categora determinada, queremos escribir una SELECCIONAR declaracin que devuelve filas.

Figura 15. Seleccione Crear un SELECT de declaracin que devuelve filas El siguiente paso es definir la consulta SQL utilizada para acceder a los datos. Como nos quieren regresar slo aquellos productos que pertenecen a una categora particular, yo uso el mismo SELECT de declaracin de GetProducts () , pero aade lo siguiente DONDEclusula: DONDE CategoryID = @ CategoryID . El @ CategoryID parmetro indica que el asistente de TableAdapter que el mtodo que estamos creando requerir un parmetro de entrada del tipo correspondiente (es decir, un entero nulos).

Figura 16. Escriba una consulta para devolver slo los productos en una categora En el ltimo paso podemos elegir que los patrones de acceso de datos a utilizar, as como personalizar los nombres de los mtodos generados. Para el patrn de relleno, vamos a cambiar el nombre a FillByCategoryID y para el regreso un patrn de cambio DataTable (el Obtn X mtodos), vamos a usar GetProductsByCategoryID .

Figura 17. Elegir los nombres de los mtodos de TableAdapter Despus de completar el asistente, el Diseador de DataSet incluye los mtodos de TableAdapter nuevo.

Figura 18. Los productos que ahora se pueden consultar por categora Tmese un momento para agregar un GetProductByProductID ( productID ) mtodo que utiliza la misma tcnica.

Estas consultas con parmetros se puede probar directamente desde el Diseador de DataSet. Haga clic derecho sobre el mtodo en el TableAdapter y elija Vista previa de datos. A continuacin, introduzca los valores de uso para los parmetros y haga clic en Vista previa.

Figura 19. Los productos pertenecientes a la categora de bebidas se muestran Con la GetProductsByCategoryID ( IdCategora ) mtodo en nuestra DAL, ahora podemos crear una pgina ASP.NET que muestra slo los productos de una categora especificada. El siguiente ejemplo muestra todos los productos que se encuentran en la categora de bebidas, que tienen un CategoryID de 1. Beverages.aspx
<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "Beverages.aspx.cs" Inherits = "Bebidas"%> <DOCTYPE html PUBLIC "- / / W3C / / DTD XHTML 1.0 Transitional / / EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> Pgina <title> ttulo </ title> <link rel="stylesheet" href="Styles.css" type="text/css" /> </ Head> <body> <form id="Form1" runat="server"> <div <h1> Bebidas </ h1> <p> <asp:GridView ID="GridView1" runat="server" CssClass="DataWebControlStyle"> <HeaderStyle CssClass="HeaderStyle" />

</ Div> </ Form> </ Body> </ Html>

<AlternatingRowStyle CssClass="AlternatingRowStyle" /> </ Asp: GridView> </ P>

Beverages.aspx.cs
using System; using System.Data; utilizando System.Configuration; using System.Collections; using System.Web; using System.Web.Security; utilizando System.Web.UI; utilizando System.Web.UI.WebControls; utilizando System.Web.UI.WebControls.WebParts; utilizando System.Web.UI.HtmlControls; utilizando NorthwindTableAdapters; pblica Bebidas clase parcial: System.Web.UI.Page { protected void Page_Load (object sender, EventArgs e) { ProductsTableAdapter productsAdapter = new ProductsTableAdapter (); GridView1.DataSource = productsAdapter.GetProductsByCategoryID (1); GridView1.DataBind (); } }

Figura 20. Los productos en la categora de bebidas es mostrado

Paso 4: Actualizar, insertar y eliminar datos


Hay dos patrones de uso general para insertar, actualizar y eliminar datos. El primer patrn, que yo llamar el modelo de base de datos directa, implica la creacin de mtodos que, cuando se invoca, emitir una INSERTAR , ACTUALIZAR , o DELETE comandos a la base de datos que opera en un registro de base de datos nica. Estos mtodos suelen ser aprobada en una serie de valores escalares (enteros, cadenas, booleanos, datetimes, y as sucesivamente) que corresponden a los valores a insertar, actualizar o eliminar. Por ejemplo, con este patrn para el Productos mesa del mtodo de eliminacin podra tener en un parmetro entero, lo que indica elProductID del registro que desea eliminar, mientras que el mtodo de insercin tomara en una cadena para el ProductName , un punto decimal para el PrecioUnidad , un nmero entero para el UnitsOnStock , y as sucesivamente.

Figura 21. Cada insercin, actualizacin y solicitud de eliminacin se enva a la base de datos inmediatamente El otro patrn que me referir como el patrn de actualizacin por lotes, es actualizar un DataSet, DataTable o coleccin de objetos DataRow en una llamada al mtodo. Con este patrn de un desarrollador de eliminaciones, inserciones, y modifica el DataRow en un DataTable y luego pasa a los objetos DataRow o DataTable en un mtodo de actualizacin. Este mtodo, a continuacin se enumeran los objetos DataRow pasado en, determina si se han modificado, aadido o eliminado (a travs de la DataRow de la propiedad RowState de valor), y las cuestiones de la solicitud de base de datos apropiada para cada registro.

Figura 22. Todos los cambios se sincronizan con la base de datos cuando el mtodo de actualizacin se invoca El TableAdapter utiliza el patrn de actualizacin por lotes por defecto, pero tambin es compatible con el patrn directo DB. Dado que hemos seleccionado la opcin "Generar instrucciones Insert, Update y Delete" desde las propiedades avanzadas al crear nuestro TableAdapter, el ProductsTableAdapter contiene una actualizacin () mtodo, que implementa el patrn de actualizacin por lotes.En concreto, el TableAdapter contiene una actualizacin () mtodo que se puede pasar el DataSet, DataTable inflexible de tipos, o uno o ms objetos DataRow. Si dej el "GenerateDBDirectMethods" casilla de verificacin marcada la primera vez que la creacin del TableAdapter el modelo DB directa tambin se llevar a cabo a travs de Insert () , Update () y Delete () mtodos. Ambos patrones de modificacin de datos usar el TableAdapter InsertCommand , UpdateCommand y DeleteCommand propiedades para emitir su INSERTAR , ACTUALIZAR , y DELETE comandos a la base de datos. Usted puede inspeccionar y modificar el InsertCommand ,UpdateCommand y DeleteCommand propiedades haciendo clic en el TableAdapter en el Diseador de DataSet y luego ir a la ventana Propiedades. (Asegrese de haber seleccionado el TableAdapter, y que el ProductsTableAdapter objeto es la seleccionada en la lista desplegable en la ventana Propiedades.)

Figura 23. El TableAdapter ha InsertCommand , UpdateCommand y DeleteCommand Propiedades Para examinar o modificar cualquiera de estas propiedades de base de datos de comandos, haga clic en el CommandTextsubpropiedad, que se abre el Generador de consultas.

Figura 24. Configurar el INSERTAR , ACTUALIZAR , y DELETE declaraciones en el Generador de consultas El siguiente ejemplo muestra cmo utilizar el modelo de actualizacin por lotes para duplicar el precio de todos los productos que no se suspenda y que tienen 25 unidades en stock o menos:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter (); / / Para cada producto, el doble de su precio si no se interrumpe y / / Hay 25 artculos en stock o menos Productos Northwind.ProductsDataTable productsAdapter.GetProducts = (); foreach (producto Northwind.ProductsRow en los productos) if (! product.Discontinued & & product.UnitsInStock <= 25) product.UnitPrice *= 2; / / Actualizacin de los productos productsAdapter.Update (productos);

El cdigo siguiente muestra cmo utilizar el modelo directo DB para eliminar mediante programacin un producto en particular, a continuacin, actualizar, y luego aadir uno nuevo:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter (); / / Eliminar el producto con ProductID 3 productsAdapter.Delete (3);

/ / Actualizar Chai (ProductID de 1), en el UnitsOnOrder a 15 productsAdapter.Update ("Chai", 1, 1, "10 cajas x 20 bolsas", 18.0m, de 39 aos, 15, 10, falso, 1); / / Aadir un nuevo producto productsAdapter.Insert ("Producto Nuevo", 1, 1, "12 latas por caja", 14.95m, 15, 0, 10, false);

Creacin de insercin personalizados, actualizacin y eliminacin de los mtodos


El Insert () , Update () y Delete () los mtodos creados por el mtodo directo DB puede ser un poco engorroso, sobre todo para las tablas con muchas columnas. Mirando el ejemplo de cdigo anterior, sin la ayuda de IntelliSense no es particularmente claro quproductos mapas columna de la tabla para cada parmetro de entrada a la actualizacin () y Insert () mtodos. Puede haber momentos en los que slo quiere actualizar una sola columna o dos, o quiere una medida de insercin () mtodo que, tal vez, devolver el valor del registro recin insertado IDENTIDAD (incremento automtico) sobre el terreno. Para crear un mtodo personalizado, vuelva al Diseador de DataSet. Haga clic derecho en el TableAdapter y elija Agregar consulta, volviendo a la asistente de TableAdapter. En la segunda pantalla podemos indicar el tipo de consulta para crear. Vamos a crear un mtodo que agrega un nuevo producto y luego devuelve el valor del registro que acaba de agregar el ProductID . Por lo tanto, optar por crear un INSERTAR consulta.

Figura 25. Crear un mtodo para agregar una nueva fila a la Productos Tabla

En la siguiente pantalla el InsertCommand 's CommandText aparece. Aumentar esta consulta agregando SCOPE_IDENTITY SELECT () al final de la consulta, lo que devolver el ltimo valor de identidad insertado en una IDENTIDAD columna en el mismo mbito. (Vea ladocumentacin tcnica para obtener ms informacin acerca de SCOPE_IDENTITY () y por qu es probable que desee utilizar SCOPE_IDENTITY () en lugar de @ @ IDENTITY .) Asegrese de que finalice la INSERTAR declaracin con un punto y coma antes de aadir el SELECCIONE comunicado.

Figura 26. Aumentar la consulta para devolver el SCOPE_IDENTITY () Valor Por ltimo, el nombre del nuevo mtodo InsertProduct .

Figura 27. Establecer el nombre de Nuevo mtodo para InsertProduct Cuando regresa al Diseador de DataSet se ver que la ProductsTableAdapter contiene un nuevo mtodo, InsertProduct . Si este nuevo mtodo no tiene un parmetro para cada columna de la Productos de mesa, es probable que usted se olvid de poner fin alINSERTAR declaracin con un punto y coma. Configurar el InsertProduct mtodo y asegurarse de que tiene un punto y coma de la delimitacin de la INSERTAR y SELECCIONAR declaraciones. Por defecto, mtodos de insercin de edicin no-query mtodos, lo que significa que devolver el nmero de filas afectadas. Sin embargo, queremos que el InsertProduct mtodo para devolver el valor devuelto por la consulta, no el nmero de filas afectadas.Para lograr esto, ajustar el InsertProduct mtodo ExecuteMode propiedad a escalar .

Figura 28. Cambiar el ExecuteMode de propiedades para escalar El siguiente cdigo muestra este nuevo InsertProduct mtodo en accin:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter (); / / Aadir un nuevo producto int = new_productID Convert.ToInt32 (productsAdapter.InsertProduct ("Producto Nuevo", 1, 1, "12 latas por caja", 14.95m, 10, 0, 10, false)); / / Aunque pensndolo bien, eliminar el producto productsAdapter.Delete (new_productID);

Paso 5: Completar el nivel de acceso a datos


Tenga en cuenta que la ProductsTableAdapters clase devuelve el Id. de categora y IdProveedor valores de los productos de la tabla, pero no incluye el CategoryName columna de la Categoras de mesa o el CompanyName de la columna de Proveedores de mesa, aunque es probable de las columnas que desea mostrar cuando se muestran los productos de la informacin. Podemos aumentar el mtodo del TableAdapter inicial, GetProducts () , que incluye tanto la CategoryName y CompanyName valores de la columna, que se actualizar el establecimiento inflexible de tipos DataTable para incluir estas nuevas columnas tambin. Esto puede representar un problema, sin embargo, como los mtodos del TableAdapter para insertar, actualizar y eliminar datos estn basados en este mtodo inicial. Afortunadamente, los mtodos de auto-generado para insertar, actualizar y eliminar no se ven afectados por subconsultas en la SELECT de la clusula. Teniendo cuidado de aadir nuestras consultas a las categoras yproveedores como subconsultas, en lugar de UNETE s, vamos a evitar tener que reelaborar esos mtodos para la modificacin de

datos. Haga clic derecho en el GetProducts () mtodo en el ProductsTableAdapter y elija Configurar. A continuacin, ajustar elSELECCIONAR clusula para que se vea as:
SELECT ProductID, ProductName, IdProveedor, CategoryID, CantidadPorUnidad, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, descatalogados, (SELECT CategoryName de categoras en las que Categoras.IdCategora = Products.CategoryID como CategoryName, (SELECT CompanyName de Proveedores DONDE Suppliers.SupplierID = Products.SupplierID) como SupplierName FROM Productos

Figura 29. Actualizar el SELECCIONE Declaracin para el GetProducts () Mtodo Despus de actualizar el GetProducts () mtodo a utilizar esta nueva consulta de la DataTable se incluyen dos nuevas columnas:CategoryName y SupplierName .

Figura 30. Los productos DataTable tiene dos nuevas columnas Tome un momento para actualizar el SELECCIONE clusula en el GetProductsByCategoryID ( IdCategora ) mtodo. Si actualiza el GetProducts () SELECT de uso de NETE sintaxis el Diseador de DataSet no ser capaz de generar automticamente los mtodos para insertar, actualizar y borrar datos de base de datos utilizando el modelo de base de datos directa. En su lugar, usted tendr que crear manualmente al igual que hicimos con el InsertProduct mtodo anteriormente en este tutorial. Adems, de forma manual tendr que proporcionar la InsertCommand , UpdateCommand y DeleteCommand valores de la propiedad, si desea utilizar el modelo de actualizacin por lotes.

Agregando el restante TableAdapters


Hasta ahora, slo hemos mirado en el trabajo con un TableAdapter nico para una tabla de base de datos nica. Sin embargo, la base de datos Neptuno contiene varias tablas relacionadas que tendremos que trabajar en nuestra aplicacin web. Un DataSet puede contener mltiples tablas de datos relacionadas. Por lo tanto, para completar nuestra DAL tenemos que aadir tablas de datos para las otras tablas que usaremos en estos tutoriales. Para aadir un nuevo objeto TableAdapter a un DataSet, abra el Diseador de DataSet, haga clic en el Diseador, y seleccione Agregar / TableAdapter. Esto crear un nuevo objeto DataTable y TableAdapter y caminar a travs del asistente se examin anteriormente en este tutorial. Tmese unos minutos para crear la siguiente TableAdapters y los mtodos que utilizan las siguientes consultas. Tenga en cuenta que las consultas en el ProductsTableAdapter incluyen las subconsultas para agarrar la categora de cada producto y los nombres de los proveedores. Adems, si usted ha estado siguiendo a lo largo, que ya ha aadido el ProductsTableAdapter clase GetProducts () yGetProductsByCategoryID ( IdCategora ) mtodos.

ProductsTableAdapter GetProducts:
SELECT ProductID, ProductName, IdProveedor, CategoryID, CantidadPorUnidad, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinuadas, (SELECT CategoryName de categoras en las que Categoras.IdCategora = Products.ProductID) como CategoryName, (SELECT NombreCompaa de Proveedores DONDE Suppliers.SupplierID = Products.SupplierID) como SupplierName FROM Productos

GetProductsByCategoryID:
SELECT ProductID, ProductName, IdProveedor, CategoryID, CantidadPorUnidad, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinuadas, (SELECT CategoryName de categoras en las que Categoras.IdCategora = Products.ProductID) como CategoryName, (SELECT NombreCompaa de Proveedores DONDE Suppliers.SupplierID = Products.SupplierID) como SupplierName FROM Productos DONDE CategoryID = @ CategoryID

GetProductsBySupplierID
SELECT ProductID, ProductName, IdProveedor, CategoryID, CantidadPorUnidad, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinuadas, (SELECT CategoryName de categoras en las que Categoras.IdCategora = Products.ProductID) como CategoryName, (SELECT NombreCompaa de Proveedores DONDE Suppliers.SupplierID = Products.SupplierID) como SupplierName FROM Productos DONDE IdProveedor = @ IdProveedor

GetProductByProductID
SELECT ProductID, ProductName, IdProveedor, CategoryID, CantidadPorUnidad, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinuadas, (SELECT CategoryName de categoras en las que Categoras.IdCategora = Products.ProductID) como CategoryName, (SELECT NombreCompaa de Proveedores DONDE Suppliers.SupplierID = Products.SupplierID) como SupplierName FROM Productos WHERE ProductID = @ ProductID

CategoriesTableAdapter
GetCategories Seleccione CategoryID, CategoryName Descripcin FROM Categoras

GetCategoryByCategoryID
Seleccione CategoryID, CategoryName Descripcin FROM Categoras DONDE CategoryID = @ CategoryID

SuppliersTableAdapter

GetSuppliers SELECCIONAR IdProveedor, CompanyName, Direccin, Ciudad, Pas, Telfono A partir de proveedores

GetSuppliersByCountry
SELECCIONAR IdProveedor, CompanyName, Direccin, Ciudad, Pas, Telfono A partir de proveedores DONDE Pas = @ Pas

GetSupplierBySupplierID
SELECCIONAR IdProveedor, CompanyName, Direccin, Ciudad, Pas, Telfono A partir de proveedores DONDE IdProveedor = @ IdProveedor

EmployeesTableAdapter
GetEmployees Seleccione EmployeeID, Apellido, Nombre, Ttulo, Fecha de contratacin ReportsTo, Pas FROM Empleados

GetEmployeesByManager
Seleccione EmployeeID, Apellido, Nombre, Ttulo, Fecha de contratacin ReportsTo, Pas FROM Empleados DONDE ReportsTo = @ ManagerID

GetEmployeeByEmployeeID
Seleccione EmployeeID, Apellido, Nombre, Ttulo, Fecha de contratacin ReportsTo, Pas FROM Empleados DONDE EmployeeID = @ EmployeeID

Figura 31. El Diseador de DataSet despus de los cuatro TableAdapters se han aadido

Agregar cdigo personalizado a la DAL


Los TableAdapters y tablas de datos aadido al conjunto de datos con tipo se expresan como un archivo de definicin de esquemas XML ( Northwind.xsd ). Usted puede ver esta informacin de esquema, haga clic en el Northwind.xsd archivo en el Explorador de soluciones y elegir Ver cdigo.

Figura 32. La definicin de esquema XML (XSD) para el conjunto de datos con tipo Neptuno Esta informacin de esquema se traduce en C # o Visual Basic en tiempo de diseo cuando se compila o en tiempo de ejecucin (si es necesario), momento en que usted puede caminar a travs de ella con el depurador. Para ver este cdigo generado automticamente vaya a la Vista de clases y profundizar en el TableAdapter o clases DataSet. Si usted no ve la Vista de clases en su pantalla, dirjase al men Ver y seleccione a partir de ah, o pulse Ctrl + Mays + C. De la Vista de clases se puede ver las propiedades, mtodos y eventos de las clases DataSet y TableAdapter. Para ver el cdigo de un mtodo en particular, haga doble clic en el nombre del mtodo en la Vista de clases o el botn derecho sobre l y seleccione Ir a definicin.

Figura 33. Inspeccionar el cdigo generado automticamente por la Seleccin Ir a definicin de la Vista de clases Mientras que genera automticamente el cdigo puede ser un gran ahorro de tiempo, el cdigo es a menudo muy genrica y tiene que ser personalizado para satisfacer las necesidades especficas de una aplicacin. El riesgo de extender cdigo generado automticamente, sin embargo, es que la herramienta que gener el cdigo podra decidir que es hora de "regenerar" y sobrescribir las personalizaciones. Con. NET 2.0 's nuevo concepto de clase parcial, es fcil dividir una clase en varios archivos. Esto nos permite aadir nuestros propios mtodos, propiedades y eventos para las clases generadas automticamente sin tener que preocuparse acerca de Visual Studio sobrescribir nuestras personalizaciones.

Para demostrar cmo personalizar la DAL, vamos a aadir una GetProducts () mtodo para la SuppliersRow clase. El SuppliersRowclase representa un nico registro de la Proveedores de mesa, cada proveedor puede proveedor de cero a muchos productos, por lo que GetProducts () devolver los productos del proveedor especificado. Para lograr esto crear un nuevo archivo de clase en elApp_Code carpeta con el nombre SuppliersRow.cs y agregue el siguiente cdigo:
using System; using System.Data; utilizando NorthwindTableAdapters; pblica parcial de la clase Neptuno { SuppliersRow public partial class { pblica GetProducts Northwind.ProductsDataTable () { ProductsTableAdapter productsAdapter = new ProductsTableAdapter (); volver productsAdapter.GetProductsBySupplierID (this.SupplierID); } } }

Esta clase parcial indica al compilador que cuando la construccin de la Northwind.SuppliersRow de clase para incluir el GetProducts () el mtodo que acabamos de definir. Si usted construye su proyecto y luego volver a la Vista de clases ver GetProducts () aparece ahora como un mtodo de Northwind.SuppliersRow .

Figura 34. El GetProducts () Mtodo es ahora parte de la Northwind.SuppliersRow clase El GetProducts () mtodo que ahora se puede utilizar para enumerar el conjunto de productos de un proveedor en particular, como muestra el siguiente cdigo:

NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter = new NorthwindTableAdapters.SuppliersTableAdapter (); / / Obtener todos los proveedores Northwind.SuppliersDataTable proveedores suppliersAdapter.GetSuppliers = (); / / Enumere los proveedores foreach (proveedor Northwind.SuppliersRow de proveedores) { Response.Write ("Proveedor:" + supplier.CompanyName); Response.Write ("<ul>"); / / Lista de los productos para este proveedor Productos Northwind.ProductsDataTable supplier.GetProducts = (); foreach (producto Northwind.ProductsRow en los productos) Response.Write ("<li>" + product.ProductName + "</ li>"); Response.Write ("</ ul> </ p>"); }

Estos datos tambin se pueden visualizar en cualquiera de los controles ASP.NET 's Web de datos. La siguiente pgina enlaza a un control GridView con dos campos:

A BoundField que muestra el nombre de cada proveedor, y Un TemplateField que contiene un control BulletedList que est enlazado a los resultados devueltos por el GetProducts ()mtodo para cada proveedor.

Vamos a examinar cmo se muestra como maestro-detalle en los informes futuros tutoriales. Por ahora, este ejemplo sirve para ilustrar el mtodo personalizado aadido a la Northwind.SuppliersRow clase. SuppliersAndProducts.aspx
<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "SuppliersAndProducts.aspx.cs" Inherits = "SuppliersAndProducts"%> <DOCTYPE html PUBLIC "- / / W3C / / DTD XHTML 1.0 Transitional / / EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> Pgina <title> ttulo </ title> <link rel="stylesheet" href="Styles.css" type="text/css" /> </ Head> <body> <form id="Form1" runat="server"> <div <h1> Proveedores y sus productos </ h1> <p> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CssClass="DataWebControlStyle"> <HeaderStyle CssClass="HeaderStyle" /> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <columnas> <asp:BoundField DataField="CompanyName" HeaderText="Supplier" /> <asp:TemplateField HeaderText="Products"> <ItemTemplate>

<Asp:. BulletedList ID = "BulletedList1" runat = "server" DataSource ='<%# (. (Northwind.SuppliersRow) ((System.Data.DataRowView) Container.DataItem) Fila) GetProducts ()%> ' DataTextField = "ProductName"> </ Asp: BulletedList> </ ItemTemplate> </ Asp: TemplateField> </ Columns> </ Asp: GridView> </ P> </ Div> </ Form> </ Body> </ Html>

SuppliersAndProducts.aspx.cs
using System; using System.Data; utilizando System.Configuration; using System.Collections; using System.Web; using System.Web.Security; utilizando System.Web.UI; utilizando System.Web.UI.WebControls; utilizando System.Web.UI.WebControls.WebParts; utilizando System.Web.UI.HtmlControls; utilizando NorthwindTableAdapters; pblica SuppliersAndProducts clase parcial: System.Web.UI.Page { protected void Page_Load (object sender, EventArgs e) { SuppliersTableAdapter suppliersAdapter = new SuppliersTableAdapter (); GridView1.DataSource suppliersAdapter.GetSuppliers = (); GridView1.DataBind (); } }

Figura 35. Nombre del Proveedor compaa cotiza en la columna de la izquierda, sus productos en el derecho

Resumen
Al construir una aplicacin web la creacin de la DAL debe ser uno de los primeros pasos, que se producen antes de empezar a crear la capa de presentacin. Con Visual Studio, la creacin de una DAL sobre la base de conjuntos de datos con tipo es una tarea que puede realizarse en 10-15 minutos, sin escribir una sola lnea de cdigo. Los tutoriales de avanzar se basar en esta DAL. En el siguiente tutorial vamos a definir una serie de reglas de negocio y ver cmo ponerlas en prctica en una capa de lgica de negocios por separado. Programacin feliz!

Leer ms
Para ms informacin sobre los temas tratados en este tutorial, consulte los siguientes recursos:

La construccin de una DAL mediante TableAdapters inflexible de tipos y tablas de datos en VS 2005 y ASP.NET 2.0 Diseo de componentes de niveles y traspaso de datos a travs de niveles Construir una capa de acceso a datos con el Diseador de DataSet de Visual Studio 2005 Cifrar informacin de configuracin de aplicaciones ASP.NET 2.0 Informacin general sobre TableAdapter Trabajando con un DataSet Utilizando el acceso a datos con tipos en Visual Studio 2005 y ASP.NET 2.0 Cmo ampliar los mtodos de TableAdapter Recuperacin de datos escalares de un procedimiento almacenado

Sobre el autor Scott Mitchell, autor de seis ASP / ASP.NET libros y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologas Web de Microsoft desde 1998. Scott trabaja como consultor independiente, instructor y escritor, recientemente completando su ltimo libro,Sams Teach Yourself ASP.NET 2.0 en 24 horas . l puede ser alcanzado en mitchell@4guysfromrolla.com oa travs de su blog, que se puede encontrar en http://ScottOnWriting.NET . Gracias especiales a ... Esta serie de tutoriales fue revisado por muchos usuarios til. Los examinadores principales para este tutorial incluyen Ron Green, Giesenow Hilton, Dennis Patterson, Shulok Liz, Abel Gmez, y Carlos Santos. Interesados en revisar mis artculos de MSDN que viene? Si es as, me escriba a mitchell@4GuysFromRolla.com .

Tutorial 2: Crear una capa de lgica de negocios


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_2_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_2_CS.exe.

Contenido del Tutorial 2 (Visual C #) Introduccin Paso 1: Creacin de la BLL Clases Paso 2: Acceso a los conjuntos de datos con tipo A travs de la BLL Clases Paso 3: Agregar validacin a nivel de campo a las clases DataRow Paso 4: Agregar reglas personalizadas de negocios a la BLL de Clases Resumen

Introduccin
La capa de acceso a datos (DAL), creada en el primer tutorial separa claramente la lgica de acceso a los datos de la lgica de presentacin. Sin embargo, mientras que el DAL separa claramente los detalles de acceso a los datos de la capa de presentacin, que no hace cumplir las reglas de negocio que se pueden aplicar. Por ejemplo, para nuestra aplicacin podemos querer para no permitir elCategoryID o IdProveedor campos de los productos de mesa, podr modificarse cuando las interrumpidas campo est establecido en 1, o puede ser que deseemos hacer cumplir las reglas de antigedad, la prohibicin de las situaciones en que es administrado por un empleado alguien que fue contratado despus de ellos. Otra situacin comn es la autorizacin - tal vez slo los usuarios de una funcin particular se puede eliminar productos o cambiar el PrecioUnidad valor. En este tutorial vamos a ver cmo centralizar las reglas de negocio en una capa de lgica empresarial (BLL) que sirve como intermediario en el intercambio de datos entre la capa de presentacin y el DAL. En una aplicacin real, el plomo en sangre debe ser aplicado en un proyecto de bibliotecas de clase independiente, sin embargo, para estos tutoriales vamos a implementar el BLL como una serie de clases en el App_Code carpeta con el fin de simplificar la estructura del proyecto. La Figura 1 ilustra las relaciones entre la arquitectura de la capa de presentacin, BLL, y DAL.

Figura 1. El BLL separa la capa de presentacin de la capa de acceso a datos e impone reglas de negocio

Paso 1: Creacin de las clases BLL


Nuestra BLL se compone de cuatro clases, una para cada TableAdapter en el DAL, cada una de estas clases BLL tendr mtodos para recuperar, insertar, actualizar y eliminar de la TableAdapter respectivos en el DAL, aplicando las reglas de negocio adecuado. Para separar de forma ms limpia de la DAL y BLL-clases relacionadas, vamos a crear dos subcarpetas en el App_Code carpeta, DAL yBLL . Simplemente haga clic en el App_Code carpeta en el Explorador de soluciones y elija Nueva carpeta. Despus de crear estas dos carpetas, mover el DataSet con tipo creada en el primer tutorial en el DAL subcarpeta. A continuacin, cree los cuatro archivos de clase en el BLL BLL subcarpeta. Para lograr esto, haga clic en el BLL subcarpeta, seleccione Agregar nuevo elemento, y elija la plantilla de la Clase. Nombre de las cuatro clases ProductsBLL , CategoriesBLL , SuppliersBLL yEmployeesBLL .

Figura 2. Aadir cuatro nuevas clases a la App_Code Carpeta A continuacin, vamos a agregar mtodos a cada una de las clases para envolver simplemente los mtodos definidos para la TableAdapters desde el primer tutorial. Por ahora, estos mtodos slo se llame directamente a la DAL, vamos a volver ms tarde para agregar la lgica empresarial necesaria. Nota Si est utilizando Visual Studio Standard Edition o superior (es decir, usted es no utilizar Visual Web Developer), si lo desea, puede disear sus clases de forma visual utilizando el Diseador de clases . Consulte el blog de Diseador de clases para ms informacin sobre esta nueva caracterstica de Visual Studio. Para el ProductsBLL clase hay que aadir un total de siete mtodos:
GetProducts () - devuelve todos los productos GetProductByProductID ( productID ) - devuelve

el producto con el ID de producto

especificado
GetProductsByCategoryID ( IdCategora )

- devuelve todos los productos de la

categora indicada

GetProductsBySupplier ( supplierID )

- devuelve todos los productos desde el

proveedor especificado
AddProduct ( productName, supplierID, categoryID, CantidadPorUnidad, precioUnitario, UnitsInStock, UnidadesEnPedido, reorderLevel, suspendido ) - se inserta un nuevo producto en la base de datos con los valores pasados en; devuelve el ProductID valor

del registro recin insertado


UpdateProduct ( productName, supplierID, categoryID, CantidadPorUnidad, precioUnitario, UnitsInStock, UnidadesEnPedido, reorderLevel, suspendido, ProductID ) - actualizaciones de un producto ya existente en la base de datos con los valores pasados en, devuelve verdadero si, precisamente, una fila se ha actualizado, falso de lo contrario DeleteProduct ( productID ) - elimina el producto especificado a partir de la base de

datos

ProductsBLL.cs

using System; using System.Data; utilizando System.Configuration; using System.Web; using System.Web.Security; utilizando System.Web.UI; utilizando System.Web.UI.WebControls; utilizando System.Web.UI.WebControls.WebParts; utilizando System.Web.UI.HtmlControls; utilizando NorthwindTableAdapters; [System.ComponentModel.DataObject] pblica ProductsBLL clase { privado ProductsTableAdapter _productsAdapter = null; ProductsTableAdapter adaptador protegidos { get { if (_productsAdapter == null) _productsAdapter = new ProductsTableAdapter (); volver _productsAdapter; } }

[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, true)] pblica GetProducts Northwind.ProductsDataTable () { Adapter.GetProducts retorno (); } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, false)] pblica Northwind.ProductsDataTable GetProductByProductID (int ProductID) { volver Adapter.GetProductByProductID (ProductID); } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, false)] pblica Northwind.ProductsDataTable GetProductsByCategoryID (int categoryID) { volver Adapter.GetProductsByCategoryID (IdCategora); } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, false)] pblica Northwind.ProductsDataTable GetProductsBySupplierID (int supplierID) { volver Adapter.GetProductsBySupplierID (supplierID); } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Insert, true)] pblica AddProduct bool (productName cadena, int? supplierID, int? IdCategora, CantidadPorUnidad cadena, decimal? precioUnitario, corto? UnitsInStock, corto? UnidadesEnPedido, corto? reorderLevel, bool suspendido) { / / Se crea una instancia nueva ProductRow Productos Northwind.ProductsDataTable = new Northwind.ProductsDataTable ();

Northwind.ProductsRow producto = products.NewProductsRow (); product.ProductName = productName; if (supplierID == null) product.SetSupplierIDNull (); ms product.SupplierID = supplierID.Value; if (IdCategora == null) product.SetCategoryIDNull (); ms product.CategoryID = categoryID.Value; if (CantidadPorUnidad == null) product.SetQuantityPerUnitNull (); ms product.QuantityPerUnit CantidadPorUnidad =; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value; if (UnitsInStock == null) product.SetUnitsInStockNull (); ms product.UnitsInStock = unitsInStock.Value; if (UnidadesEnPedido == null) product.SetUnitsOnOrderNull (); ms product.UnitsOnOrder = unitsOnOrder.Value; if (reorderLevel == null) product.SetReorderLevelNull (); ms product.ReorderLevel = reorderLevel.Value; product.Discontinued = interrumpidas; / / Aadir el nuevo producto products.AddProductsRow (producto); int = rowsAffected Adapter.Update (productos); / / Devuelve verdadero si, precisamente, una fila se inserta, de lo contrario falso } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Update, true)] pblica UpdateProduct bool (productName cadena, int? supplierID, int? IdCategora, CantidadPorUnidad cadena, decimal? precioUnitario, corto? UnitsInStock, corto? UnidadesEnPedido, corto? reorderLevel, bool interrumpido, int ProductID) { Productos Northwind.ProductsDataTable = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0]; product.ProductName = productName; if (supplierID == null) product.SetSupplierIDNull (); ms product.SupplierID = supplierID.Value; if (IdCategora == null) product.SetCategoryIDNull (); ms product.CategoryID = categoryID.Value; if (CantidadPorUnidad == null) product.SetQuantityPerUnitNull (); ms product.QuantityPerUnit CantidadPorUnidad =; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value; if (UnitsInStock == null) product.SetUnitsInStockNull (); ms product.UnitsInStock = unitsInStock.Value; if (UnidadesEnPedido == null) product.SetUnitsOnOrderNull (); ms product.UnitsOnOrder = unitsOnOrder.Value; if (reorderLevel == null) product.SetReorderLevelNull (); ms product.ReorderLevel = reorderLevel.Value; product.Discontinued = interrumpidas; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); volver rowsAffected == 1;

/ / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Delete, true)] pblica DeleteProduct bool (int ProductID) { int = rowsAffected Adapter.Delete (ProductID); / / Devuelve verdadero si, precisamente, una fila se ha eliminado, false en caso contrario volver rowsAffected == 1; } }

Los mtodos que devuelva los datos - GetProducts , GetProductByProductID , GetProductsByCategoryID yGetProductBySuppliersID - es bastante sencillo ya que basta con llamar hacia abajo en el DAL. Mientras que en algunos casos puede haber reglas de negocio que deben aplicarse a este nivel (por ejemplo, las reglas de autorizacin basado en el usuario actualmente conectado o el papel al que pertenece el usuario), simplemente a dejar estos mtodos como est. Para estos mtodos, entonces, el plomo en sangre sirve solamente como un proxy a travs del cual la capa de presentacin accede a los datos subyacentes de la capa de acceso a datos. El AddProduct y UpdateProduct mtodos tanto tomar como parmetros los valores de los campos de producto y aadir un nuevo producto o actualizacin de uno ya existente, respectivamente. Como muchos de los productos columnas de la tabla se puede aceptarNULL valores ( CategoryID , IdProveedor y Precio por unidad , por nombrar algunos), los parmetros de entrada para AddProduct yUpdateProduct que se asignan a tales columnas usan el uso de tipos anulables . Los tipos anulables son nuevos. NET 2.0 y proporcionar una tcnica para indicar si un tipo de valor que, en cambio, ser nula . En C # se puede marcar un tipo de valor como un tipo anulable aadiendo ? despus de que el tipo (por ejemplo, int x,? ). Se refieren a la tipos anulables seccin en la Gua de programacin de C # para ms informacin. Los tres mtodos devuelven un valor booleano que indica si se inserta un registro, actualizado o eliminado desde la operacin no puede resultar en una fila afectada. Por ejemplo, si el desarrollador de pginas llamadas DeleteProduct pasando un ProductID de un producto no existe, el DELETE comunicado emitido a la base de datos no tendr ningn efecto y por lo tanto la DeleteProduct mtodo devolver falso . Tenga en cuenta que cuando se aade un nuevo producto o actualizacin de uno ya existente que tomamos en los valores de campo del nuevo producto o modificar como una lista de los escalares en lugar de aceptar un ProductsRow ejemplo. Este enfoque fue escogido debido a que el ProductsRow clase se deriva de la ADO.NET DataRow de clase, que no tiene un constructor predeterminado sin parmetros. Con el fin de crear un nuevo ProductsRow ejemplo, primero debe crear una ProductsDataTable instancia y luego llamar a su NewProductRow () mtodo (que hacemos en AddProduct ). Esta carencia se levanta la cabeza cuando nos referimos a la insercin y actualizacin de los productos utilizando el ObjectDataSource. En resumen, el ObjectDataSource intenta crear una instancia de los parmetros de entrada. Si el mtodo BLL espera un ProductsRow ejemplo, el ObjectDataSource a tratar de crear uno, pero no debido a la falta de un constructor sin parmetros por defecto. Para ms informacin sobre este problema, consulte los siguientes

cargos dos ASP.NET Foros: ObjectDataSources Actualizacin con conjuntos de datos con tipos y problema con ObjectDataSource y DataSet con tipos declarados . A continuacin, en tanto AddProduct y UpdateProduct , el cdigo crea una ProductsRow ejemplo, que se llena con los valores acaba de pasar pulg Al asignar valores a DataColumn de una DataRow diferentes sobre el terreno las comprobaciones de validacin puede ocurrir. Por lo tanto, de forma manual poniendo el pasado en los valores de nuevo en una fila de datos ayuda a garantizar la validez de los datos que se pasa al mtodo de plomo en sangre. Desgraciadamente las clases DataRow inflexible de tipos generado por Visual Studio no utilice tipos anulables. Por el contrario, para indicar que una determinada DataColumn de una DataRow debe corresponder a un NULL el valor base de datos que debe utilizar el Set ColumnName Null () mtodo. En UpdateProduct en primer lugar de carga en el producto de actualizacin mediante GetProductByProductID ( productID ) . Si bien esto puede parecer un viaje innecesario a la base de datos, este viaje extra que vale la pena probar en futuros tutoriales que exploran la concurrencia optimista. Concurrencia optimista es una tcnica para asegurarse de que dos usuarios que estn trabajando simultneamente en los mismos datos no sobrescribir accidentalmente los cambios respectivos. Acaparamiento de la totalidad del expediente tambin hace ms fcil para crear mtodos de actualizacin en el BLL que slo modificar un subconjunto de las columnas de DataRow. Cuando exploramos la SuppliersBLL clase vamos a ver un ejemplo. Por ltimo, sealar que el ProductsBLL clase tiene el atributo DataObject que se le aplica (el [System.ComponentModel.DataObject]derecho de sintaxis antes de la declaracin de clase en la parte superior del archivo) y los mtodos tienen atributos DataObjectMethodAttribute . El DataObject atributo marca la clase como un objeto adecuado para la unin a un control ObjectDataSource , mientras que el DataObjectMethodAttribute indica el propsito del mtodo. Como veremos en futuros tutoriales, ASP.NET 2.0 's ObjectDataSource facilita la declaracin de datos de acceso de una clase. Para ayudar a filtrar la lista de posibles clases para unirse a la ObjectDataSource asistente, por defecto, slo las clases marcadas como DataObjects se muestran en la lista desplegable del asistente lista. El ProductsBLL clase funcionar igual de bien sin estos atributos, pero aadiendo que hace que sea ms fcil trabajar con el asistente en el ObjectDataSource.

Agregando las otras Clases


Con la ProductsBLL clase completa, todava tenemos que aadir las clases para trabajar con las categoras, proveedores y empleados.Tome un momento para crear las siguientes clases y mtodos que utilizan los conceptos en el ejemplo anterior:

CategoriesBLL.cs

SuppliersBLL.cs

GetCategories () GetCategoryByCategoryID ( IdCategora ) GetSuppliers () GetSupplierBySupplierID ( supplierID ) GetSuppliersByCountry ( pas ) UpdateSupplierAddress ( supplierID , direccin , ciudad , pas )

EmployeesBLL.cs

GetEmployees () GetEmployeeByEmployeeID ( employeeID ) GetEmployeesByManager ( ManagerID )

El mtodo que vale la pena destacar es la SuppliersBLL clase UpdateSupplierAddress mtodo. Este mtodo proporciona una interfaz para actualizar slo informacin de la direccin del proveedor. Internamente, este mtodo se lee en el SupplierDataRow objeto con el objetivo especfico supplierID (con GetSupplierBySupplierID ), se establece la relacin direccinpropiedades, y luego llama a abajo en el SupplierDataTable 's actualizacin de mtodo. El UpdateSupplierAddress mtodo siguiente:
[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Update, true)] UpdateSupplierAddress pblico bool (int supplierID, direccin de la cadena, la cadena de la ciudad, el pas de cuerda) { Northwind.SuppliersDataTable proveedores = Adapter.GetSupplierBySupplierID (supplierID); if (suppliers.Count == 0) / / Ningn registro coincidente, devuelva falso return false; ms { Proveedor Northwind.SuppliersRow = proveedores [0]; if (direccin == null) supplier.SetAddressNull (); ms supplier.Address address =; if (ciudad == null) supplier.SetCityNull (); ms supplier.City = ciudad; if (pas == null) supplier.SetCountryNull (); ms supplier.Country pas =; / / Actualiza la Direccin relacionados con un proveedor de informacin int = rowsAffected Adapter.Update (proveedor); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; } }

Refirase a la descarga de este artculo para mi aplicacin completa de las clases BLL.

Paso 2: Acceso a los conjuntos de datos con tipo a travs de las clases de BLL
En el primer tutorial hemos visto ejemplos de cmo trabajar directamente con el DataSet mediante programacin, pero con la adicin de nuestras clases BLL, la capa de presentacin deben trabajar contra la BLL en su lugar. En el AllProducts.aspx ejemplo del primer tutorial, el ProductsTableAdapter fue utilizado para obligar a la lista de productos a un GridView, como se muestra en el siguiente cdigo:
ProductsTableAdapter productsAdapter = new ProductsTableAdapter (); GridView1.DataSource productsAdapter.GetProducts = (); GridView1.DataBind ();

Para utilizar las nuevas clases BLL, todo lo que hay que cambiar es la primera lnea de cdigo - simplemente reemplace elProductsTableAdapter objeto con un ProductBLL objeto:

ProductsBLL productLogic = new ProductsBLL (); GridView1.DataSource productLogic.GetProducts = (); GridView1.DataBind ();

Las clases BLL tambin se puede acceder de forma declarativa (al igual que el DataSet) con el ObjectDataSource. Vamos a discutir el ObjectDataSource con mayor detalle en los siguientes tutoriales.

Figura 3. La lista de los productos se muestra en un GridView

Paso 3: Agregar validacin a nivel de campo a las clases DataRow


A nivel de campo de validacin se comprueba que se refiere a los valores de propiedad de los objetos de negocio al insertar o actualizar. Algunas reglas de validacin a nivel de campo de los productos incluyen:

El ProductName campo debe ser de 40 caracteres o menos de longitud El CantidadPorUnidad campo debe ser de 20 caracteres o menos de longitud El ProductID , ProductName y descatalogados los campos son obligatorios, pero todos los dems campos son opcionales El Precio por unidad , UnitsInStock , UnitsOnOrder y ReorderLevel campos debe ser mayor que o igual a cero

Estas reglas pueden y deben ser expresados a nivel de base de datos. El lmite de caracteres en el ProductName y CantidadPorUnidadcampos son capturados por los tipos de datos de las columnas del Productos de mesa ( nvarchar (40) y nvarchar (20) , respectivamente). Si los campos son obligatorios y opcionales se expresan por si la columna de la tabla de base de datos permite NULLs. Cuatro restricciones de

comprobacin de que existe garantizar que slo los valores mayores o iguales a cero se puede hacer en elPrecioUnidad , UnitsInStock , UnitsOnOrder o ReorderLevel columnas. Adems de aplicar estas reglas en la base de datos tambin debera aplicarse a nivel de conjunto de datos. De hecho, la longitud del campo y si un valor es necesario u opcional ya estn capturados para establecer cada DataTable de DataColumn. Para ver la existente a nivel de campo de validacin proporciona automticamente, vaya al Diseador de DataSet, seleccione un campo de una de las tablas de datos y luego ir a la ventana Propiedades. Como muestra la Figura 4 se muestra la CantidadPorUnidad DataColumn en elProductsDataTable tiene una longitud mxima de 20 caracteres y permite NULL valores. Si intentamos establecer el ProductsDataRow 'sCantidadPorUnidad propiedad a un valor de cadena de ms de 20 caracteres una ArgumentException ser lanzada.

Figura 4. El DataColumn Proporciona bsica de campo de nivel de validacin Desafortunadamente, no podemos especificar los controles lmites, como el PrecioUnidad valor debe ser mayor o igual a cero, a travs de la ventana Propiedades. A fin de proporcionar este tipo de validacin a nivel de campo que necesitamos para crear un controlador de eventos para el evento ColumnChanging DataTable . Como se mencion en el tutorial anterior, el conjunto de datos, tablas de datos y objetos DataRow creado por el DataSet se puede ampliar mediante el uso de clases parciales. Utilizando esta tcnica podemos crear un ColumnChanging controlador de eventos para

el ProductsDataTable clase. Comience por crear una clase en el App_Code carpeta con el nombre ProductsDataTable.ColumnChanging.cs .

Figura 5. Agregue una nueva clase a la App_Code Carpeta A continuacin, cree un controlador de eventos para el ColumnChanging caso de que asegura que el PrecioUnidad , UnitsInStock ,UnitsOnOrder y ReorderLevel valores de la columna (si no es NULL ) es mayor o igual a cero. Si cualquiera de las columnas como est fuera de rango, lanzar una ArgumentException . ProductsDataTable.ColumnChanging.cs
pblica parcial de la clase Neptuno { pblica parcial de la clase ProductsDataTable { pblico superior BeginInit vaco () { this.ColumnChanging + = ValidateColumn; } vaco ValidateColumn (object sender, DataColumnChangeEventArgs e) { if (e.Column.Equals (this.UnitPriceColumn)) { if (! Convert.IsDBNull (e.ProposedValue) & & (decimal) e.ProposedValue <0) { lanzar nuevos ArgumentException ("Precio por unidad no puede ser menor que cero", "Precio por unidad"); } } else if (e.Column.Equals (this.UnitsInStockColumn) | | e.Column.Equals (this.UnitsOnOrderColumn) | | e.Column.Equals (this.ReorderLevelColumn)) {

if (! Convert.IsDBNull (e.ProposedValue) & & (corto) e.ProposedValue <0) { throw new ArgumentException (String.Format ("{0} no puede ser menor que cero", e.Column.ColumnName), e.Column.ColumnName); } } } } }

Paso 4: Agregar Reglas del Negocio personalizada a las clases de la BLL


Adems de la validacin a nivel de campo, no puede ser de alto nivel de reglas de negocio personalizadas que involucran diferentes entidades o conceptos que no puede expresar en el mbito de una sola columna, tales como:

Si un producto est descatalogado, su PrecioUnidad no se pueden actualizar Pas de un empleado de la residencia debe ser el mismo pas de su administrador de la residencia Un producto no puede ser interrumpido si es el nico producto proporcionado por el proveedor

Las clases BLL debe contener controles para garantizar el cumplimiento de las reglas de negocio de la aplicacin. Estos controles se pueden aadir directamente a los mtodos que se aplican. Imagnese que nuestras reglas de negocio dictan que un producto no puede ser interrumpido si marc fue el nico producto de un proveedor determinado. Es decir, si el producto X es el nico producto que compramos desde el proveedor Y , no podra marcar Xcomo interrumpidas, si, sin embargo, el proveedor Y nos suministra con tres productos, A , B y C , entonces se podra marcar todos y cada uno de estos, como suspendido. Una regla de negocio extrao, pero las reglas de negocio y el sentido comn no siempre estn alineados! Para hacer cumplir esta regla de negocio en el UpdateProducts mtodo que empezara por comprobar si interrumpidas se establece en verdadero , y si es as, que nosotros llamamos GetProductsBySupplierID para determinar la cantidad de productos que compramos desde el proveedor de este producto. Si un solo producto se compra a este proveedor, lanzamos unaApplicationException .
pblica UpdateProduct bool (productName cadena, int? supplierID, int? IdCategora, CantidadPorUnidad cadena, decimal? precioUnitario, corto? UnitsInStock, corto? UnidadesEnPedido, corto? reorderLevel, bool interrumpido, int ProductID) { Productos Northwind.ProductsDataTable = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0];

/ / Comprobacin de reglas de negocio - no puede dejar de un producto que es suministrado por slo / / Un solo proveedor if (suspendido) { / / Obtener los productos que compramos de este proveedor Northwind.ProductsDataTable productsBySupplier = Adapter.GetProductsBySupplierID (product.SupplierID); if (productsBySupplier.Count == 1) / / Este es el nico producto que compramos de este proveedor throw new ApplicationException ("No se puede marcar un producto como discontinuado si es el nico producto comprado a un proveedor"); } product.ProductName = productName; if (supplierID == null) product.SetSupplierIDNull (); ms product.SupplierID = supplierID.Value; if (IdCategora == null) product.SetCategoryIDNull (); ms product.CategoryID = categoryID.Value; if (CantidadPorUnidad == null) product.SetQuantityPerUnitNull (); ms product.QuantityPerUnit CantidadPorUnidad =; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value; if (UnitsInStock == null) product.SetUnitsInStockNull (); ms product.UnitsInStock = unitsInStock.Value; if (UnidadesEnPedido == null) product.SetUnitsOnOrderNull (); ms product.UnitsOnOrder = unitsOnOrder.Value; if (reorderLevel == null) product.SetReorderLevelNull (); ms product.ReorderLevel = reorderLevel.Value; product.Discontinued = interrumpidas; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1;

Responder a errores de validacin en la capa de presentacin


Al llamar a la BLL de la capa de presentacin que puede decidir si se debe intentar manejar las excepciones que puedan subir o dejar que ellos suben a ASP.NET (lo que elevar el HttpApplication 's error del evento). Para controlar una excepcin cuando se trabaja con el plomo en sangre mediante programacin, podemos utilizar un Try ... Catch bloque, como muestra el siguiente ejemplo:
ProductsBLL productLogic = new ProductsBLL (); Informacin / / Actualizar ProductID 1 de tratar de { / / Esto no ya que estamos tratando de utilizar un / / Precio por unidad menor que el valor 0. productLogic.UpdateProduct ("Scott t", 1, 1, null,-14m, 10, null, null, false, 1); } catch (ArgumentException ae) { Response.Write ("Hubo un problema:" + ae.Message); }

Como veremos en futuros tutoriales, control de excepciones que brotan de la BLL al utilizar un control Web de datos para insertar, actualizar o eliminar datos pueden ser manipulados directamente en un controlador de eventos en lugar de tener que envolver el cdigo de prueba .. . capturar bloques.

Resumen
Una aplicacin bien diseada se hace a mano en distintas capas, cada una de ellas encierra un papel particular. En el primer tutorial de esta serie de artculos que hemos creado una capa de acceso de datos utilizando conjuntos de datos con tipo, en este tutorial hemos construido una capa de lgica de negocios como una serie de clases de nuestra aplicacin App_Code carpeta que hacer descender a nuestro DAL. El BLL implementa el terreno y de negocios a nivel de la lgica de nuestra aplicacin. Adems de la creacin de un BLL separado, como lo hicimos en este tutorial, otra opcin es extender los mtodos de los TableAdapters "mediante el uso de clases parciales. Sin embargo, esta tcnica no nos permite reemplazar los mtodos existentes ni separar nuestra DAL y BLL nuestra tan limpiamente como el enfoque que hemos tomado en este artculo. Con la completa DAL y BLL, estamos listos para empezar en nuestra capa de presentacin. En el siguiente tutorial vamos a tomar un pequeo desvo a partir de temas de acceso a los datos y definir un diseo de pgina coherente para su uso a travs de los tutoriales. Programacin feliz!

Tutorial 3: Pginas principales y navegacin de sitios


Junio de 2006
Publicado: 25 de Septiembre de 2006

Scott Mitchell Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_3_CS.exe.


En esta pgina

Introduccin Paso 1: Creacin de la pgina principal Paso 2: Adicin de una pgina de inicio al sitio web Paso 2: Creacin de un mapa del sitio Paso 3: Visualizacin de un men segn el mapa del sitio Paso 4: Adicin de elementos de navegacin tipo breadcrumb Paso 5: Adicin de la pgina predeterminada de cada seccin Resumen Acerca del autor

Introduccin
Una caracterstica comn de los sitios web orientados al usuario es la presencia de un diseo de pgina lgico para todo el sitio y de un esquema de navegacin. ASP.NET 2.0 presenta dos caractersticas nuevas que facilitan notablemente la creacin de un diseo de pgina de todo el sitio y de un esquema de navegacin: pginas principales y navegacin de sitios. Las pginas principales permiten a los desarrolladores crear una plantilla para todo el sitio con regiones configuradas para la edicin. Esta plantilla se puede aplicar posteriormente a las pginas ASP.NET del sitio. En dichas pginas slo es necesario proporcionar el contenido de las regiones que se pueden editar de las pginas principales; las dems marcas de la pgina principal son idnticas para el resto de pginas ASP.NET que usan dicha pgina. Este modelo permite a los desarrolladores definir y unificar un diseo de pgina de todo el sitio, de modo que facilita la creacin de un aspecto coherente y garantiza que todas las pginas se pueden actualizar de una forma sencilla. El sistema de navegacin de sitios ofrece a los desarrolladores de pginas un mecanismo para definir un mapa del sitio y una API para dicho mapa que se debe consultar mediante programacin. Los nuevos controles web de navegacin (Menu, TreeView y SiteMapPath) facilitan la transformacin total o parcial del mapa del sitio en un elemento de navegacin de la interfaz de usuario comn. Vamos a usar el proveedor de navegacin de sitios predeterminado, lo que significa que nuestro mapa del sitio estar definido en un archivo con formato XML. Para ilustrar estos conceptos y conseguir que nuestros sitios web de tutoriales se utilicen ms, durante esta leccin vamos a definir un diseo de pgina para todo el sitio, implementar un mapa del sitio y agregar la interfaz de usuario de navegacin. Cuando terminemos este tutorial habremos aprendido un diseo de sitio web perfeccionado para construir las pginas web del tutorial.

Figura 1. Resultado final del tutorial


Principio de la pgina

Paso 1: Creacin de la pgina principal


El primer paso consiste en la creacin de la pgina principal del sitio. En estos momentos este sitio web est formado nicamente por DataSet con tipo (Northwind.xsd en la carpeta App_Code), clases BLL (ProductsBLL.cs, CategoriesBLL.cs, etc. en la carpeta App_Code), la base de datos (NORTHWND.MDF en la carpeta App_Data), el archivo de configuracin (Web.config) y el archivo de la hoja de estilo CSS (Styles.css). Vaci las pginas y archivos que mostraban el uso de DAL y BLL en los dos primeros tutoriales porque analizaremos esos ejemplos con ms detalle en prximos tutoriales.

Figura 2. Archivos del proyecto Para crear una pgina principal, haga clic con el botn secundario en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar nuevo elemento. A continuacin, seleccione el tipo de pgina principal de la lista de plantillas y denomnela Site.master.

Figura 3. Adicin de una pgina principal nueva al sitio web Aqu se define el diseo de pgina para todo el sitio, en la pgina principal. Puede usar la vista Diseo y agregar todos los controles web o de diseo que necesite, o bien puede agregar las marcas manualmente en la vista Cdigo fuente. En mi pgina principal

usohojas de estilo en cascada para definir las posiciones y estilos con configuracin CSS definidos en el archivo externo Style.css. Mientras que no es posible deducirlo del marcado mostrado a continuacin, las reglas CSS se definen de tal forma que el contenido de navegacin de <div> se presente en posicionamiento absoluto para que aparezca a la izquierda y tenga una profundidad fija de 200 pxeles. Site.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Working with Data Tutorials</title> <link href="Styles.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <form id="form1" runat="server"> <div id="header"> <span class="title">Working with Data Tutorials</span> <span class="breadcrumb">TODO: Breadcrumb will go here...</span> </div> <div id="content"> <asp:contentplaceholder id="MainContent" runat="server"> <!-- Page-specific content will go here... --> </asp:contentplaceholder> </div> <div id="navigation"> TODO: Menu will go here... </div> </form> </div> </body> </html>

Una pgina principal define el diseo de pgina esttica y las regiones que se pueden editar mediante las pginas ASP.NET que usan la pgina principal. El control ContentPlaceHolder, que se puede ver dentro del contenido de <div>, marca estas regiones con contenido que se puede editar. Esta pgina principal tiene slo un ContentPlaceHolder (MainContent), pero las pginas principales pueden tener varios ContentPlaceHolders. Al cambiar a la vista Diseo con el marcado anterior, se visualiza el diseo de la pgina principal. Todas las pginas ASP.NET que usan esta pgina principal tendrn este diseo uniforme y la posibilidad de especificar el marcado para la regin MainContent

Figura 4. Pgina principal en la vista Diseo


Principio de la pgina

Paso 2: Adicin de una pgina de inicio al sitio web


Una vez que hemos definido la pgina principal, estamos listos para agregar pginas ASP.NET al sitio web. Empecemos por agregar Default.aspx a la pgina de inicio del sitio web. Haga clic con el botn secundario en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar nuevo elemento. Elija la opcin Formulario web de la lista de plantillas y denomine el archivo Default.aspx. Tambin debe activar la casilla de verificacin "Seleccionar la pgina principal".

Figura 5. Adicin de formulario web nuevo, activacin de la casilla de verificacin "Seleccionar la pgina principal" Despus de hacer clic en el botn Aceptar, se nos pide que seleccionemos la pgina principal que debe usar esta pgina ASP.NET nueva. Es posible tener varias pginas principales en un proyecto, aunque ahora tengamos slo una.

Figura 6. Seleccin de la pgina principal que debe usar la pgina ASP.NET Despus de elegir la pgina principal, las pginas ASP.NET nuevas presentarn el marcado siguiente:

Default.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> </asp:Content>

En la directiva @Page se hace referencia al archivo de la pgina principal usado (MasterPageFile="~/Site.master") y el marcado de las pginas ASP.NET contiene un control Content para todos los controles ContentPlaceHolder definidos en la pgina principal, con los ContentPlaceHolderID del control asignados al control Content para un ContentPlaceHolder especfico. El control Content es donde se coloca la marca que quiere que aparezca en el ContentPlaceHolder correspondiente. Establezca el atributo Title de la directiva @Page en Inicio y escriba algn contenido de bienvenida en el control Content: Default.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Home" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> <h1>Welcome to the Working with Data Tutorial Site</h1> <p>This site is being built as part of a set of tutorials that illustrate some of the new data access and databinding features in ASP.NET 2.0 and Visual Web Developer.</p> <p>Over time, it will include a host of samples that demonstrate:</p> <li>Building a DAL (data access layer),</li> <li>Using strongly typed TableAdapters and DataTables</li> <li>Master-Detail reports</li> <li>Filtering</li> <li>Paging,</li> <li>Two-way databinding,</li> <li>Editing,</li> <li>Deleting,</li> <li>Inserting,</li> <li>Hierarchical data browsing,</li> <li>Hierarchical drill-down,</li> <li>Optimistic concurrency,</li> <li>And more!</li> </ul> </asp:Content> <ul>

El atributo Title de la directiva @Page nos permite indicar el ttulo de la pgina desde la pgina ASP.NET, aunque el elemento <title> no est definido en la pgina principal. Tambin podemos definir el ttulo mediante programacin utilizando Page.Title. Observe tambin que las referencias de pginas principales a hojas de estilo (como Style.css) se actualizan automticamente para que funcionen en todas las pginas ASP.NET, independientemente del directorio de la pgina principal donde se ubica la pgina ASP.NET.

Si cambiamos a la vista Diseo, podemos visualizar cmo se vera nuestra pgina en un explorador. Tenga en cuenta que en la vista Diseo de la pgina ASP.NET slo se puede editar el contenido de las regiones configuradas para ello; la marca nonContentPlaceHolder definida en la pgina principal aparece en gris.

Figura 7. La vista Diseo de la pgina ASP.NET muestra las regiones que se pueden y no se pueden editar Cuando un explorador visita una pgina Default.aspx, el motor ASP.NET combina automticamente el contenido de pgina de la pgina principal y el contenido de ASP.NET y representa el contenido combinado en el formato HTML final que se enva al explorador solicitante. Cuando se actualiza el contenido de la pgina principal, todas las pginas ASP.NET que usan esta pgina principal vuelven a combinar su contenido con el contenido nuevo de la pgina principal la prxima vez que se produzca una solicitud. En resumen, el modelo de pgina principal permite definir una nica plantilla de diseo de pgina (pgina principal) cuyos cambios se reflejarn de forma inmediata en todo el sitio. Adicin de pginas ASP.NET adicionales al sitio web Vamos a dedicar unos segundos a agregar cdigos auxiliares de pginas ASP.NET al sitio que contendr finalmente las diferentes demostraciones de informes. Existirn ms de 35 demostraciones en total, de modo que es preferible crear slo las primeras pginas con cdigos auxiliares y no todas. Puesto que tambin habr muchas categoras de demostraciones, agregue una carpeta para las categoras con el fin de administrarlas mejor. De momento, agregue las tres carpetas siguientes:

BasicReporting Filtering

CustomFormatting

Por ltimo, agregue archivos nuevos como se muestra en el Explorador de soluciones de la figura 8. Acurdese de activar la casilla de verificacin "Seleccionar la pgina principal" despus de agregar cada archivo.

Figura 8. Adicin de los archivos siguientes


Principio de la pgina

Paso 2: Creacin de un mapa del sitio


Una de las mayores dificultades de administrar un sitio web formado por ms de unas cuantas pginas es poder ofrecer a los visitantes una forma directa de navegar por el sitio. Debemos empezar por comprobar que la estructura de navegacin del sitio est definida. A continuacin, dicha estructura debe estar traducida a elementos de navegacin de la interfaz de usuario, como mens o elementos tipo breadcrumb. Por ltimo, todo este proceso se debe mantener y actualizar mediante la adicin de pgina nuevas al sitio y la eliminacin de otras existentes. Antes de la creacin de ASP.NET 2.0, los desarrolladores se encontraban solos ante la creacin de la estructura de navegacin de un sitio, su mantenimiento y la traduccin de la misma a elementos de navegacin de la interfaz de usuario. Sin embargo, gracias a ASP.NET 2.0 los desarrolladores pueden utilizar el sistema de navegacin de sitios integrado, que ofrece una gran flexibilidad.

El sistema de navegacin de sitios de ASP.NET 2.0 ofrece a los desarrolladores un medio para definir un mapa del sitio y posteriormente tener acceso a esta informacin a travs de una API de programacin. ASP.NET incluye un proveedor de mapas del sitio que asume que los datos del mapa se almacenarn en un archivo XML formateado de una forma concreta. Sin embargo, puesto que el sistema de navegacin de sitios viene integrado en el modelo de proveedor, se puede ampliar para que sea compatible con otras formas de serializacin de la informacin del mapa del sitio. El artculo de Jeff Prosise, The SQL Site Map Provider You've Been Waiting For (puede estar en ingls) explica como crear un proveedor del mapa del sitio que almacene el mapa en una base de datos de SQL Server; otra opcin es crear un proveedor del mapa del sitio a partir de la estructura del sistema de archivos. No obstante, en este tutorial vamos a usar el proveedor de mapas del sitio predeterminado que se incluye con ASP.NET 2.0. Para crear el mapa del sitio, haga clic con el botn secundario en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar nuevo elemento. Mantenga el nombre Web.sitemap y haga clic en el botn Agregar

Figura 9. Adicin de un mapa del sitio al proyecto El archivo del mapa del sitio est en formato XML. Tenga en cuenta que Visual Studio incluye IntelliSense para la estructura del mapa del sitio. El archivo del mapa del sitio debe tener el nodo <siteMap> como nodo raz, que debe contener exactamente un elemento secundario <siteMapNode>. Ese primer elemento <siteMapNode> puede, a su vez, contener un nmero indeterminado de elementos <siteMapNode> descendientes. Defina el mapa del sitio en funcin de la estructura del sistema de archivos. Es decir, agregue un elemento <siteMapNode> para cada una de las tres carpetas y elementos secundarios <siteMapNode> para cada una de las pginas ASP.NET contenidas en dichas carpetas, como se muestra a continuacin: Web.sitemap:

<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="~/Default.aspx" title="Home" description="Home"> <siteMapNode title="Basic Reporting" url="~/BasicReporting/Default.aspx" description="Basic Reporting Samples"> <siteMapNode url="~/BasicReporting/SimpleDisplay.aspx" title="Simple Display" description="Displays the complete contents of a database table." /> <siteMapNode url="~/BasicReporting/DeclarativeParams.aspx" title="Declarative Parameters" description="Displays a subset of the contents of a database table using parameters." /> <siteMapNode url="~/BasicReporting/ProgrammaticParams.aspx" title="Setting Parameter Values" description="Shows how to set parameter values programmatically." /> </siteMapNode> <siteMapNode title="Filtering Reports" url="~/Filtering/Default.aspx" description="Samples of Reports that Support Filtering"> <siteMapNode url="~/Filtering/FilterByDropDownList.aspx" title="Filter by Drop-Down List" description="Filter results using a drop-down list." /> <siteMapNode url="~/Filtering/MasterDetailsDetails.aspx" title="MasterDetails-Details" description="Filter results two levels down." /> <siteMapNode url="~/Filtering/DetailsBySelecting.aspx" title="Details of Selected Row" description="Show detail results for a selected item in a GridView." /> </siteMapNode> <siteMapNode title="Customized Formatting" url="~/CustomFormatting/Default.aspx" description="Samples of Reports Whose Formats are Customized"> <siteMapNode url="~/CustomFormatting/CustomColors.aspx" title="Format Colors" description="Format the grid&apos;s colors based on the underlying data." /> <siteMapNode url="~/CustomFormatting/GridViewTemplateField.aspx" title="Custom Content in a GridView" description="Shows using the TemplateField to customize the contents of a field in a GridView." /> <siteMapNode url="~/CustomFormatting/DetailsViewTemplateField.aspx" title="Custom Content in a DetailsView" description="Shows using the TemplateField to customize the contents of a field in a DetailsView." /> <siteMapNode url="~/CustomFormatting/FormView.aspx" title="Custom Content in a FormView" description="Illustrates using a FormView for a highly customized view." /> <siteMapNode url="~/CustomFormatting/SummaryDataInFooter.aspx" title="Summary Data in Footer" description="Display summary data in the grid's footer." /> </siteMapNode> </siteMapNode> </siteMap>

El mapa del sitio define la estructura de navegacin del sitio web; se trata de una jerarqua que describe las secciones que forman el sitio. Cada elemento <siteMapNode> de Web.sitemap representa una seccin de la estructura de navegacin del sitio.

Figura 10. El mapa del sitio representa una estructura de navegacin jerrquica (haga clic aqu para ampliarla) ASP.NET expone la estructura del mapa del sitio a travs de la clase SiteMap class! href(http://msdn2.microsoft.com/en-us/library/system.web.sitemap.aspx) de .NET Framework. Esta clase presenta una propiedad CurrentNode, que devuelve informacin de la seccin que el usuario est visitando; la propiedad RootNode devuelve la raz del mapa del sitio (Inicio en nuestro mapa del sitio). Ambas propiedades, CurrentNode y RootNode, devuelven instancias SiteMapNode!href(http://msdn2.microsoft.com/enus/library/system.web.sitemapnode.aspx), que tienen propiedades como ParentNode, ChildNodes, NextSibling, PreviousSibling, etc., que permiten desplazarse por la jerarqua del mapa del sitio.
Principio de la pgina

Paso 3: Visualizacin de un men segn el mapa del sitio


Se puede tener acceso a los datos en ASP.NET 2.0 mediante lenguaje de programacin, como en ASP.NET 1.x, o bien mediante declaracin a travs de los controles de origen de datos nuevos. Existen varios controles de origen de datos integrados, como el control SqlDataSource para tener acceso a los datos de la base de datos relacional o el control ObjectDataSource para tener acceso a los datos de clases, entre otros. Incluso puede crear controles de origen de datos personalizados. Los controles de origen de datos desempean la funcin de proxy entre su pgina ASP.NET y los datos subyacentes. Por lo general, para visualizar un conjunto de datos recuperados del control de origen de datos, se agrega otro control web a la pgina y se enlaza al control de origen de datos. Para enlazar un control web a un control de origen de datos, configure la propiedad DataSourceID del control web con el mismo valor de la propiedad ID del control de origen de datos. ASP.NET incluye el control SiteMapDataSource, que nos permite enlazar un control web al mapa de nuestro sitio web, para facilitar la administracin de los datos del mapa del sitio. Se usan normalmente dos controles web (TreeView y Menu) para presentar una interfaz de usuario de navegacin. Para enlazar los datos del mapa del sitio a uno de estos controles, agregue un SiteMapDataSource a la pgina y un control TreeView o Menu que tenga la propiedad DataSourceID configurada correspondientemente. Por ejemplo, podramos agregar un control Menu a la pgina principal mediante las marcas siguientes:
<div id="navigation">

<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1"> </asp:Menu> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> </div>

Para tener un mayor control sobre la pgina con formato HTML emitida, podemos enlazar el control SiteMapDataSource al control Repeater como sigue:
<div id="navigation"> <ul> <li><asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink></li> <asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1"> <ItemTemplate> <li> <asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink> </li> </ItemTemplate> </asp:Repeater> </ul> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" /> </div>

El control SiteMapDataSource devuelve un nivel a la jerarqua del mapa del sitio cada vez; en primer lugar del nodo raz del mapa (Inicio en nuestro mapa del sitio), a continuacin de los niveles siguientes (Basic Reporting, Filtering Reports y Customized Formatting) y as sucesivamente. Cuando se enlaza SiteMapDataSource a un Repeater (repetidor), ste enumera el primer nivel devuelto y crea una instancia de ItemTemplate para cada instancia SiteMapNode del primer nivel. Para tener acceso a una propiedad concreta del SiteMapNode, podemos usar Eval(propertyName), que es la forma que tenemos de obtener las propiedades Url y Title de SiteMapNode para el control HyperLink. El ejemplo de Repeater anterior representa el marcado siguiente:
<li> <a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a> </li> <li> <a href="/Code/Filtering/Default.aspx">Filtering Reports</a> </li> <li> <a href="/Code/CustomFormatting/Default.aspx">Customized Formatting</a> </li>

Estos nodos del mapa del sitio (Basic Reporting, Filtering Reports y Customized Formatting) forman el segundo nivel representado del mapa del sitio, no el primero. La razn es que la propiedad ShowStartingNode de SiteMapDataSource est establecida en False, lo que provoca que el SiteMapDataSource omita el nodo raz del mapa y, en vez del primer nivel, devuelve el segundo nivel de la jerarqua del mapa.

Para visualizar los elementos secundarios de Basic Reporting, Filtering Reports y Customized Formatting SiteMapNodes, podemos agregar otro Repeater al ItemTemplate del Repeater inicial. Este segundo Repeater se enlaza a la propiedad ChildNodes de la instancia SiteMapNode como sigue:
<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1"> <ItemTemplate> <li> <asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink> <asp:Repeater runat="server" DataSource='<%# ((SiteMapNode) Container.DataItem).ChildNodes %>'> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li> <asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater> </li> </ItemTemplate> </asp:Repeater>

Estos dos Repeater generan el siguiente marcado (algunas marcas se han omitido por razones de brevedad): <li> <a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a> <ul> <li> <a href="/Code/BasicReporting/SimpleDisplay.aspx">Simple Display</a> </li> <li> <a href="/Code/BasicReporting/DeclarativeParams.aspx">Declarative Parameters</a> </li> <li> <a href="/Code/BasicReporting/ProgrammaticParams.aspx">Setting Parameter Values</a> </li> </ul></li><li> <a href="/Code/Filtering/Default.aspx">Filtering Reports</a> ...</li><li> <a href="/Code/CustomFormatting/Default.aspx">Customized Formatting</a> ...</li> Mediante los estilos CSS elegidos del libro de Rachel Andrew The CSS Anthology: 101 Essential Tips, Tricks, and Hacks (puede estar en ingls), se ha dado un estilo a los elementos <ul> y <li> cuyo marcado genera el aspecto siguiente:

Figura 11. Men formado por dos Repeater y varios estilos CSS Este men se encuentra en la pgina principal y est enlazado al mapa del sitio definido en Web.sitemap, lo que significa que cualquier cambio realizado en el mapa del sitio se reflejar inmediatamente en todas las pginas que usen la pgina principal Site.master. Deshabilitacin de ViewState Todos los controles ASP.NET pueden mantener opcionalmente su estado en el estado de vista, que se serializa como un campo de formulario oculto de la pgina HTML representada. Los controles se valen del estado de vista para tener presente su estado cambiado mediante programacin en las devoluciones, como los datos enlazados a un control web de datos. El estado de vista permite recordar la informacin durante las devoluciones; sin embargo, aumenta el tamao del marcado que se debe enviar al cliente y puede producir una recarga importante de la pgina si no se controla bien. Los controles web de datos, en especial el control GridView, son particularmente adecuados para agregar cantidades adicionales de kilobytes al marcado de una pgina. Mientras que dicho incremento puede ser insignificante con respecto al ancho de banda o a los usuarios de la

intranet, el estado de vista puede sumar varios segundos al viaje de ida y vuelta de los usuarios que llaman. Para ver el efecto del estado de vista, visite una pgina en un explorador y vea despus el cdigo fuente emitido por la pgina (en Internet Explorer, vaya al men Ver y seleccione la opcin Cdigo fuente). Tambin puede activar el seguimiento de pgina para ver la asignacin del estado de vista utilizado por los controles de la pgina. La informacin del estado de vista se serializa en un campo de formulario oculto denominado __VIEWSTATE, que se ubica en un elemento <div> justo despus de la etiqueta de apertura <form>. El estado de vista slo se mantiene cuando se utiliza un formulario web; si la pgina ASP.NET no incluye un <form runat="server"> en la sintaxis de declaracin, no existir un campo de formulario oculto __VIEWSTATE en las marcas representadas. El campo de formulario VIEWSTATE generado por la pgina principal suma alrededor de 1.800 bytes al marcado de la pgina. Esta recarga adicional se debe, en primer lugar, al control Repeater, porque el contenido del control SiteMapDataSource se mantiene en el estado de vista. Mientras que puede parecer que 1.800 bytes no es tanto, al usar un GridView con muchos campos y registros, el estado de vista se puede multiplicar fcilmente por 10 o ms. El estado de vista se puede deshabilitar en la misma pgina o mediante los controles estableciendo la propiedad EnableViewState en false, lo que reduce el tamao del marcado representado. Puesto que el estado de vista para un control web de datos mantiene los datos enlazados a dicho control durante las devoluciones, al deshabilitar este estado para el control, se deben enlazar los datos para cada una de las devoluciones. Mientras que de esto se encarga el desarrollador de la pgina en la versin 1.x de ASP.NET; en ASP.NET 2.0, los controles web de datos se deben volver a enlazar al control de origen de datos para cada devolucin, si es necesario. Si desea reducir el estado de vista de la pgina, establezca la propiedad EnableViewState del control Repeater en false. Esto se puede realizar mediante la ventana Propiedades del Diseador o mediante declaracin en la vista Cdigo fuente. Una vez que se ha realizado el cambio de Repeater mediante declaracin, el marcado debe tener el siguiente aspecto:
<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1" EnableViewState="False"> <ItemTemplate> ... ItemTemplate contents omitted for brevity ... </ItemTemplate> </asp:Repeater>

Despus de este cambio, el tamao del estado de vista de la pgina representada se habr reducido a tan slo 52 bytes, lo que supone un ahorro del 97% en el tamao del estado de vista. En los tutoriales de esta serie, deshabilitaremos de forma predeterminada el estado de vista de los controles web de datos para reducir el tamao del marcado representado. En la mayora de los ejemplos, estableceremos la propiedad EnableViewState en false sin necesidad de explicitarlo. Slo hablaremos del estado de vista cuando se deba habilitar para que el control web de datos cumpla su funcin.
Principio de la pgina

Paso 4: Adicin de elementos de navegacin tipo breadcrumb

Para completar la pgina principal vamos a agregar un elemento de navegacin de la interfaz de usuario tipo breadcrumb a cada pgina. El elemento breadcrumb muestra rpidamente a los usuarios su ubicacin actual en la jerarqua del sitio. Agregar elementos breadcrumb en ASP.NET 2.0 es sencillo; slo hay que aadir un control SiteMapPath a la pgina, sin necesidad de cdigos. En nuestro sitio vamos a agregar este control al <div> de encabezado:
<span class="breadcrumb"> <asp:SiteMapPath ID="SiteMapPath1" runat="server"> </asp:SiteMapPath> </span>

El elemento breadcrumb muestra la pgina actual de la jerarqua del mapa del sitio en la que est el visitante y las pginas anteriores del nodo del mapa hasta llegar a la raz (Inicio en nuestro mapa del sitio).

Figura 12. El elemento breadcrumb muestra la pgina actual y las anteriores de la jerarqua del mapa del sitio
Principio de la pgina

Paso 5: Adicin de la pgina predeterminada de cada seccin


Los tutoriales de nuestro sitio estn divididos en varias categoras, a saber, Basic Reporting, Filtering, Custom Formatting, etc., con una carpeta en cada una y los tutoriales correspondientes en forma de pginas ASP.NET dentro de dicha carpeta. Asimismo, cada carpeta contiene una pgina Default.aspx. Vamos a visualizar todos los tutoriales de esta seccin correspondientes a esta pgina predeterminada. Es decir, tendramos vnculos a SimpleDisplay.aspx, DeclarativeParams.aspx y ProgrammaticParams.aspx para la pgina Default.aspx predeterminada de la carpeta BasicReporting. Ahora podemos volver a usar la clase SiteMap y un control web de datos para ver esta informacin, que se corresponde con el mapa del sitio definido en Web.sitemap. Vamos a ver una lista desordenada volviendo a usar un Repeater, pero esta vez veremos el ttulo y la descripcin de los tutoriales. Puesto que las marcas y los cdigos necesarios para ello se deben repetir para cada pgina Default.aspx, podemos concretar esta lgica de la interfaz de usuario en un control de usuario. Cree una carpeta denominada UserControls en el sitio web y agrguele un elemento nuevo del tipo Control de usuario web denominado SectionLevelTutorialListing.ascx; agregue tambin el marcado que se incluye a continuacin:

Figura 13. Adicin de un control de usuario web a la carpeta UserControls SectionLevelTutorialListing.ascx


<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SectionLevelTutorialListing.ascx.cs" Inherits="UserControls_SectionLevelTutorialListing" %> <asp:Repeater ID="TutorialList" runat="server" EnableViewState="False"> <HeaderTemplate><ul></HeaderTemplate> <ItemTemplate> <li><asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>' Text='<%# Eval("Title") %>'></asp:HyperLink> - <%# Eval("Description") %></li> </ItemTemplate> <FooterTemplate></ul></FooterTemplate> </asp:Repeater>

SectionLevelTutorialListing.ascx.cs
using using using using using using using using using using System; System.Data; System.Configuration; System.Collections; System.Web; System.Web.Security; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.WebControls.WebParts; System.Web.UI.HtmlControls;

public partial class UserControls_SectionLevelTutorialListing : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { // If SiteMap.CurrentNode is not null,

// bind CurrentNode's ChildNodes to the GridView if (SiteMap.CurrentNode != null) { TutorialList.DataSource = SiteMap.CurrentNode.ChildNodes; TutorialList.DataBind(); } } }

En el ejemplo de Repeater anterior, enlazamos los datos de SiteMap a Repeater mediante declaracin; sin embargo, el control de usuario SectionLevelTutorialListing lo hace mediante programacin. En el controlador de eventos Page_Load, se hace una comprobacin para asegurarse de que esta es la primera visita a la pgina (no una devolucin) y de que la URL de esta pgina est asignada a un nodo del mapa del sitio. Si dicho control de usuario se usa en una pgina que no se corresponde a una entrada <siteMapNode>, SiteMap.CurrentNode devolver null y no se enlazarn datos al Repeater. Si damos por hecho que tenemos un CurrentNode, debemos enlazar la coleccin ChildNodes a Repeater. Puesto que nuestro mapa del sitio est configurado de tal forma que la pgina Default.aspx de cada seccin es el nodo primario de todos los tutoriales de dicha seccin, este cdigo mostrar vnculos a todos los tutoriales de la seccin junto con las descripciones correspondientes, como se muestra en la captura de pantalla siguiente. Una vez que se ha creado este Repeater, abra las pginas Default.aspx de cada carpeta, vaya a la vista Diseo y arrastre el control de usuario en la superficie de diseo desde el Explorador de soluciones hasta el lugar donde desea que aparezca la lista de tutoriales.

Figura 14. Control de usuario agregado a Default.aspx

Figura 15. Enumeracin de los tutoriales contenidos en Basic Reporting


Principio de la pgina

Resumen
Con el mapa del sitio definido y la pgina principal completa, hemos conseguido una pgina con un diseo y un esquema de navegacin lgicos para los tutoriales relacionados con datos. Independientemente del nmero de pginas que agreguemos al sitio, el proceso de actualizacin del diseo de pgina de todo el sitio o de la informacin de navegacin es rpido y sencillo gracias a la centralizacin de la informacin. En concreto, la informacin de diseo de pgina se define en la pgina principal Site.master y el mapa del sitio en Web.sitemap. No necesitamos escribir ningn cdigo para obtener este diseo de pgina para todo el sitio y este mecanismo de navegacin y, adems, hemos conseguido en Visual Studio un diseo intuitivo donde vemos lo que hay. Despus de haber terminado las capas de acceso a datos y de lgica de negocios y de haber definido un diseo de pgina coherente y un mecanismo de navegacin del sitio, estamos preparados para empezar con los modelos de informe ms comunes. En los tres tutoriales siguientes analizaremos las tareas de elaboracin de informes bsicas, es decir, la visualizacin de datos recuperados de BLL en los controles GridView, DetailsView y FormView. Suerte con la programacin.

Tutorial 4: Visualizacin de datos con el ObjectDataSource


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_4_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_4_CS.exe.

Contenido del Tutorial 4 (Visual C #) Introduccin Paso 1: Agregar y configurar el control ObjectDataSource Paso 2: Agregar un control web de datos y enlace a la ObjectDataSource con Themes para una apariencia consistente que muestra una grabacin a una hora en el DetailsView Resumen

Introduccin
Con nuestra arquitectura de aplicaciones y diseo web pgina completa, estamos listos para empezar a explorar cmo llevar a cabo una serie de datos comunes y las tareas de presentacin de informes relacionados. En los tutoriales anteriores hemos visto cmo enlazar mediante programacin los datos de la DAL y BLL a un control de datos de la Web en una pgina ASP.NET. Esta sintaxis - la asignacin del control web de datos DataSource propiedad de los datos para mostrar y llamar al control DataBind () mtodo - fue el modelo utilizado en las aplicaciones ASP.NET 1.x, y puede seguir utilizndose en el 2.0. Sin embargo, ASP.NET 2.0 's nuevos controles de origen de datos ofrecen una forma declarativa para trabajar con datos. Mediante estos controles se pueden enlazar los datos recuperados de la BLL creado en el tutorial anterior, sin tener que escribir una lnea de cdigo! ASP.NET 2.0 con cinco barcos construidos en los controles de origen de datos - SqlDataSource , AccessDataSource ,ObjectDataSource , XmlDataSource y SiteMapDataSo urce - aunque usted puede construir su propia controles de orgenes de datos , si es necesario. Puesto que hemos desarrollado una arquitectura de nuestra aplicacin tutorial, vamos a estar utilizando el ObjectDataSource contra nuestras clases BLL.

Figura 1. ASP.NET 2.0 incluye cinco controles de origen de datos El ObjectDataSource funciona como un proxy para trabajar con algn otro objeto. Para configurar el ObjectDataSource se especifica este objeto subyacente y cmo sus mtodos de mapa para los aos ObjectDataSource Seleccionar ,Insertar , Actualizar y Eliminar mtodos. Una vez que este objeto subyacente se ha especificado y sus mtodos asignados a la de ObjectDataSource, podemos enlazar el ObjectDataSource a un control de datos de la Web. ASP.NET viene con muchos controles web de datos, incluyendo los controles GridView, DetailsView, RadioButtonList y DropDownList, entre otros. Durante el ciclo de vida de pgina, el control de datos de Web pueden necesitar acceder a los datos, est destinado a, que se llevar a cabo mediante la invocacin de su ObjectDataSource Seleccione el mtodo, si el control web de datos compatible con la insercin, actualizacin o eliminacin de las llamadas pueden hacerse a su ObjectDataSource Insertar , Actualizar o Eliminar mtodos. Estas llamadas se enrutan por el ObjectDataSource a los mtodos del objeto apropiado subyacente como el siguiente diagrama se muestra.

Figura 2. El ObjectDataSource sirve como un proxy Mientras que el ObjectDataSource se puede utilizar para llamar a los mtodos para insertar, actualizar o eliminar datos, vamos a centrarse en los datos contables; tutoriales futuro explorar el uso de los controles ObjectDataSource y datos de la web que modifican los datos.

Paso 1: Agregar y configurar el control ObjectDataSource


Comience abriendo el SimpleDisplay.aspx pgina en el BasicReporting carpeta, a la vista Diseo y, a continuacin, arrastre un control ObjectDataSource del cuadro de herramientas a la superficie de diseo de la pgina. El ObjectDataSource aparece como un cuadro gris en la superficie de diseo, ya que no produce ningn cdigo, sino que simplemente accede a los datos mediante la invocacin de un mtodo de un objeto especificado. Los datos devueltos por un ObjectDataSource puede mostrar un control web de datos, como GridView, DetailsView, FormView, y as sucesivamente. Nota Como alternativa, puede que agregar el control de datos de la Web a la pgina y luego, de sus etiquetas inteligentes, elija la opcin <Nueva entrada> datos de la lista desplegable. Para especificar el ObjectDataSource objeto subyacente y cmo los mtodos de ese objeto se asignan a las de ObjectDataSource, haga clic en el enlace Configurar origen de datos de la ObjectDataSource de etiquetas inteligentes.

Figura 3. Haga clic en el enlace Configuracin de datos de origen de la etiqueta inteligente Esto nos lleva a la asistente Configurar origen de datos. En primer lugar, debe especificar el objeto ObjectDataSource es trabajar con ellos. Si la opcin "Mostrar slo los datos de los componentes de" casilla est marcada, la lista desplegable que aparece en esta pantalla slo muestra los objetos que han sido decoradas con el DataObject atributo.Actualmente, nuestra lista incluye los TableAdapters del conjunto de datos con tipo y las clases BLL que hemos creado en el tutorial anterior. Si usted se olvid de agregar el DataObject atribuyen a las clases de la capa de lgica de negocios que no los vea en esta lista. En ese caso, desactive la casilla "Mostrar slo los componentes de datos" casilla de verificacin para ver todos los objetos, que debe incluir las clases BLL (junto con las otras clases en el DataSet con tipo - la DataTables DataRows, y as sucesivamente). A partir de esta primera pantalla seleccione la ProductsBLL clase de la lista desplegable y haga clic en Siguiente.

Figura 4. Especificar el objeto para utilizar con el control ObjectDataSource La siguiente pantalla del asistente le pedir que seleccione qu mtodo debera invocar el ObjectDataSource. La lista desplegable muestra los mtodos que devuelven los datos en el objeto seleccionado de la pantalla anterior. Aqu vemos GetProductsByProductID , GetProducts , GetProductsByCategoryID y GetProductsBySupplier ID . Seleccione la GetProducts mtodo de la lista desplegable y haga clic en Finalizar (si se ha aadido laDataObjectMethodAttribute a la ProductBLL mtodos 's, como se muestra en el tutorial anterior, esta opcin ser seleccionada por defecto).

Figura 5. Elegir el mtodo para devolver los datos de la ficha Seleccionar

Configurar manualmente el ObjectDataSource


El ObjectDataSource Asistente para la configuracin de orgenes de datos ofrece una forma rpida de especificar el objeto que utiliza y de asociar lo que los mtodos del objeto son invocados. Puede, sin embargo, configurar el ObjectDataSource a travs de sus propiedades, ya sea a travs de la ventana Propiedades o directamente en el marcado declarativo. Basta con establecer la TypeName propiedad con el tipo de objeto subyacente a utilizar, y elSelectMethod con el mtodo que se invoca cuando se recuperan datos.
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" SelectMethod = "GetProducts" TypeName = "ProductsBLL"> </ Asp: ObjectDataSource>

Incluso si usted prefiere el asistente Configurar origen de datos puede haber ocasiones en las que tenga que configurar manualmente el ObjectDataSource, como el asistente slo las listas creadas por el desarrollador clases. Si desea enlazar el ObjectDataSource a una clase en el NET Framework -. Tales como la clase Membership , para acceder a informacin de cuentas de usuario, o la clase Directory para trabajar con la informacin del sistema de archivos - que tendr que configurar manualmente el ObjectDataSource propiedades.

Paso 2: Agregar un control web de datos y enlace a la ObjectDataSource

Una vez que el ObjectDataSource se ha aadido a la pgina y configurado, estamos listos para agregar controles de datos Web a la pgina para mostrar los datos devueltos por el de ObjectDataSource Seleccionar mtodo. Ningn tipo de control de datos de Web se puede enlazar a un ObjectDataSource, vamos a ver que muestra el ObjectDataSource de datos en un GridView, DetailsView y FormView.

La vinculacin de un GridView a la ObjectDataSource


Agregar un control GridView desde el cuadro de herramientas para SimpleDisplay.aspx superficie de diseo 's. De la etiqueta inteligente del control GridView, elija el control ObjectDataSource que agreg en el paso 1. Esto crear automticamente una BoundField en el GridView para cada propiedad que devuelve los datos de la de ObjectDataSource Seleccione el mtodo (es decir, las propiedades definidas por el DataTable Productos).

Figura 6. Un GridView ha sido aadido a la pgina y vinculado a ObjectDataSource A continuacin, puede personalizar, cambiar, o eliminar BoundFields el GridView, haga clic en la opcin Editar columnas de la etiqueta inteligente.

Figura 7. Gestionar la BoundFields GridView travs del cuadro de dilogo Editar columnas Tmese un momento para modificar BoundFields el GridView, la eliminacin de la ProductID , IdProveedor ,CategoryID , CantidadPorUnidad , UnitsInStock , UnitsOnOrder y Reorde rLevel BoundFields. Basta con seleccionar el BoundField de la lista en la parte inferior izquierda y haga clic en el botn de eliminar (en la X roja) para eliminarlos. A continuacin, cambiar el BoundFields para que el CategoryName y SupplierName BoundFields preceder a laPrecioUnidad BoundField mediante la seleccin de estos BoundFields y haciendo clic en la flecha hacia arriba.Establecer el HeaderText propiedades de la BoundFields resto de productos , categora , proveedores y precios , respectivamente. A continuacin, los precios BoundField formato de moneda mediante la creacin de la BoundFieldHtmlEncode propiedad en False y su DataFormatString propiedad {0: c} . Por ltimo, en sentido horizontal alinear elprecio a la derecha y el interrumpidas casilla de verificacin en el centro a travs de la ItemStyle / HorizontalAlignpropiedad.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <columnas> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" /> <Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio" HtmlEncode = "false" SortExpression = "UnitPrice"> <ItemStyle HorizontalAlign="Right" /> </ Asp: BoundField>

<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued"> <ItemStyle HorizontalAlign="Center" /> </ Asp: CheckBoxField> </ Columns> </ Asp: GridView>

Figura 8. BoundFields el GridView se han personalizado

El uso de temas para un aspecto uniforme


Estos tutoriales se esfuerzan por eliminar cualquier configuracin de estilo de control de nivel, en lugar de utilizar hojas de estilo definidas en un archivo externo siempre que sea posible. El styles.css archivo contieneDataWebControlStyle , HeaderStyle , RowStyle y AlternatingRowStyle clases CSS que se debe utilizar para dictar la aparicin de la Web los datos utilizados en los controles de estos tutoriales. Para lograr esto, se podra establecer el GridView CssClass propiedad DataWebControlStyle , y su HeaderStyle , RowStyle y AlternatingRowStylepropiedades ' CssClass propiedades en consecuencia. Si nos fijamos estos CssClass propiedades en el control Web tendramos que recordar explcitamente estos valores de propiedades para el control de todas y cada una Web de datos en nuestro tutoriales. Un enfoque ms manejable es definir el valor por defecto CSS relacionadas con las propiedades de los controles GridView, DetailsView, FormView y los controles de uso de un tema. Un tema es una coleccin de valores de propiedades de

control de nivel-, las imgenes, y las clases CSS que se pueden aplicar a las pginas a travs de un sitio para hacer cumplir una apariencia comn. Nuestro tema no se incluyen las imgenes o archivos de CSS (vamos a dejar la hoja de estilo styles.css tal y como est definido en la carpeta raz de la aplicacin web), pero se incluyen dos Skins. A la piel es un archivo que define las propiedades por defecto de un control web. En concreto, vamos a tener un archivo de la piel de los controles GridView y DetailsView, lo que indica el valor por defecto CssClass las propiedades relacionadas. Comience por agregar un archivo de la piel a su proyecto llamado GridView.skin haciendo clic derecho sobre el nombre del proyecto en el Explorador de soluciones y elija Agregar nuevo elemento.

Figura 9. Agregar un archivo de mscara con nombre GridView.skin Los archivos de la piel deben ser colocados en un tema, que se encuentran en el App_Themes carpeta. Ya que an no tienen una carpeta, Visual Studio ofrecer amablemente a crear uno para nosotros cuando la adicin de nuestra piel en primer lugar. Haga clic en S para crear el App_Theme carpeta y colocar la nueva GridView.skin archivo all.

Figura 10. Vamos a Visual Studio Crear la App_Theme carpeta

Esto crear un nuevo tema en el App_Themes GridView carpeta con el nombre con el archivo de la piel GridView.skin .

Figura 11. El tema de GridView ha sido aadido a la App_Theme carpeta Cambie el nombre del tema GridView a DataWebControls (botn derecho del ratn sobre la carpeta GridView en elApp_Theme carpeta y seleccione Cambiar nombre). A continuacin, introduzca el siguiente marcado en el GridView.skinarchivo:
<asp:GridView runat="server" CssClass="DataWebControlStyle"> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <RowStyle CssClass="RowStyle" /> <HeaderStyle CssClass="HeaderStyle" /> </ Asp: GridView>

Esto define las propiedades por defecto para el CssClass propiedades relacionadas para cualquier GridView en cualquier pgina que utiliza el tema DataWebControls. Vamos a aadir otra piel para el DetailsView, un control web de datos que vamos a utilizar en breve. Aadir un nuevo skin en el tema DataWebControls llamado DetailsView.skin y agregue el siguiente marcado:
<asp:DetailsView runat="server" CssClass="DataWebControlStyle"> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <RowStyle CssClass="RowStyle" /> <FieldHeaderStyle CssClass="HeaderStyle" /> </ Asp: DetailsView>

Con nuestro tema definido, el ltimo paso es aplicar el tema a nuestra pgina de ASP.NET. Un tema puede ser aplicado sobre una base de pgina por pgina, o para todas las pginas de un sitio web. Vamos a usar este tema para todas las pginas del sitio web. Para lograr esto, agregue el marcado siguiente a Web.config 's <system.web> seccin:

<pages styleSheetTheme="DataWebControls" />

Eso es todo lo que hay que hacer! El StyleSheetTheme valor indica que las propiedades especificadas en el tema debeno anular las propiedades especificadas en el nivel de control. Para especificar que la configuracin del tema debera estar por encima ajustes de control, utilice el tema de atributos en lugar de StyleSheetTheme , por desgracia, la configuracin de tema especificado por el tema atributo no aparecen en la vista de diseo de Visual Studio. Se refieren a temas y mscaras de ASP.NET Informacin general y estilos del lado del servidor mediante temas para obtener ms informacin sobre temas y mscaras, vea Cmo: Aplicar temas de ASP.NET para ms informacin sobre la configuracin de una pgina para uso de un tema.

Figura 12. El GridView Muestra el nombre del producto, categora, Proveedor, Precio, informacin y descatalogados

Viendo un registro a la vez en el DetailsView


El GridView muestra una fila para cada registro devuelto por el control de origen de datos al que est destinado. Hay veces, sin embargo, cuando queremos mostrar un nico registro o simplemente grabar uno a la vez. El control DetailsView ofrece esta funcionalidad, lo que hace como un archivo HTML <table> con dos columnas y una fila para cada columna o propiedad compartida con el control. Usted puede pensar en el DetailsView como un GridView con un registro nico giro de 90 grados. Comience por agregar un control DetailsView sobre el GridView en SimpleDisplay.aspx . A continuacin, se unen a la misma como el control ObjectDataSource GridView. Al igual que con los controles GridView, un BoundField se aadir a la DetailsView para cada propiedad

del objeto devuelto por la de ObjectDataSource Seleccionar mtodo. La nica diferencia es que el DetailsView BoundFields estn dispuestos horizontal y no vertical.

Figura 13. Aadir un DetailsView a la pgina y enlazarla a la ObjectDataSource Al igual que los controles GridView, DetailsView BoundFields puede ser ajustado para proporcionar una visualizacin ms personalizada de los datos devueltos por el ObjectDataSource. La figura 14 muestra el DetailsView despus de su BoundFields y CssClass propiedades se han configurado para hacer su aparicin similar al del ejemplo GridView.

Figura 14. El DetailsView muestra un solo registro Tenga en cuenta que el DetailsView slo muestra el primer registro devuelto por su origen de datos. Para permitir al usuario paso a travs de todos los registros, uno a la vez, hay que habilitar la paginacin para el DetailsView. Para ello, volver a Visual Studio y marque la casilla Habilitar paginacin en la etiqueta inteligente del DetailsView es.

Figura 15. Habilitar la paginacin en el control DetailsView

Figura 16. Con la paginacin activada, el DetailsView permite al usuario ver cualquier de los productos Hablaremos ms acerca de la paginacin en futuros tutoriales.

Un diseo ms flexible para mostrar un registro a la vez


El DetailsView es bastante rgida en la forma en que muestra cada registro devuelto por el ObjectDataSource. Podemos querer una visin ms flexible de los datos. Por ejemplo, en lugar de mostrar el nombre del producto, categora, proveedor, precio, y la informacin de suspender cada uno en una fila separada, es posible que desea mostrar el nombre del producto y el precio en un <h4> partida, con la categora y la informacin de los proveedores que aparecen a continuacin el nombre y el precio en un tamao de fuente ms pequeos. Y no puede cuidar para mostrar los nombres de propiedades (producto, categora, etc) junto a los valores. El control FormView proporciona este nivel de personalizacin. En lugar de utilizar campos (como GridView y DetailsView lo hacen), el FormView utiliza plantillas, que permiten una mezcla de controles Web, HTML esttico, y la sintaxis de enlace de datos . Si est familiarizado con el control Repeater de ASP.NET 1.x, se puede pensar en el FormView como Repeater para mostrar un nico registro. Agregue un control FormView a la SimpleDisplay.aspx superficie de diseo de pgina. Inicialmente, el FormView muestra como un bloque gris, nos informa que tenemos que ofrecer, como mnimo, el control de ItemTemplate .

Figura 17. El FormView debe incluir un ItemTemplate

Puede enlazar el FormView directamente a un control de origen de datos a travs de la etiqueta inteligente del FormView, que crear un defecto ItemTemplate de forma automtica (junto con un EditItemTemplate yInsertItemTemplate , si el control de ObjectDatatSource InsertMethod y UpdateMethod se establecen las propiedades). Sin embargo, para este ejemplo vamos a enlazar los datos a los controles FormView y especificar suItemTemplate manualmente. Comience por establecer el FormView DataSourceID propiedad de la ID del control ObjectDataSource, ObjectDataSource1 . A continuacin, cree el ItemTemplate para que muestre el nombre del producto y el precio en un <h4> elemento y los nombres de categora y el cargador por debajo que en un tamao de fuente ms pequeos.
<asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource1" EnableViewState="False"> <ItemTemplate> <h4> <% # Eval ("ProductName")%> (<% # Eval ("Precio por unidad", "{0: c}") %>)</ h4> Categora: <% # Eval ("NombreCategora")%>; Proveedor: <% # Eval ("SupplierName") %> </ ItemTemplate> </ Asp: FormView>

Figura 18. El primer producto (Chai) se muestra en un formato personalizado El <% # Eval (propertyName)%> es la sintaxis de enlace de datos. El Eval mtodo devuelve el valor de la propiedad especificada para el objeto actual que est siendo enlazado al control FormView. Lee el artculo de Alex de Homero ha simplificado y ampliado la sintaxis de enlace de datos en ASP.NET 2.0 para obtener ms informacin sobre las entradas y salidas de enlace de datos. Al igual que el DetailsView, FormView slo muestra el primer registro devuelto por el ObjectDataSource. Usted puede habilitar la paginacin en el FormView para permitir que los visitantes de paso a travs de los productos uno a la vez.

Resumen
Acceso a los datos y mostrar de una capa de lgica empresarial se puede lograr sin escribir una sola lnea de cdigo gracias a ASP.NET 2.0 's control ObjectDataSource. El control ObjectDataSource llama a un mtodo especfico de una clase y devuelve los resultados. Estos resultados se pueden mostrar en un control web de datos que est destinado a la ObjectDataSource. En este tutorial nos fijamos en la unin GridView, DetailsView y FormView a la ObjectDataSource. Hasta ahora slo hemos visto cmo usar el ObjectDataSource para invocar un mtodo sin parmetros, pero lo que si queremos llamar a un mtodo que espera que los parmetros de entrada, tales como el ProductBLL claseGetProductsByCategoryID ( IdCategora ) ? Con el fin de llamar a un mtodo que espera que uno o ms parmetros que debe configurar el ObjectDataSource para especificar los valores de estos parmetros. Vamos a ver cmo lograr esto en nuestro prximo tutorial. Programacin feliz!

Leer ms
Para ms informacin sobre los temas tratados en este tutorial, consulte los siguientes recursos:

Crear sus propios controles de orgenes de datos Ejemplos GridView de ASP.NET 2.0 Ha simplificado y ampliado el enlace de datos de sintaxis en ASP.NET 2.0 Temas en ASP.NET 2.0 Del lado del servidor estilos con temas Cmo: Aplicar temas de ASP.NET mediante programacin

Tutorial 5: Parmetros declarativa


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_5_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_5_CS.exe.

Contenido del Tutorial 5 (Visual C #)

Introduccin El uso de un valor de parmetro en el cdigo Establecer el valor del parmetro al valor de la propiedad de un control de Web Resumen

Introduccin
En el tutorial anterior vimos mostrar los datos con los controles GridView, DetailsView, FormView y los controles enlazados a un control ObjectDataSource que invoc el GetProducts () el mtodo de la ProductsBLL clase. ElGetProducts () mtodo devuelve un establecimiento inflexible de tipos DataTable rellena con todos los registros de la base de datos Northwind de los productos de mesa. El ProductsBLL clase contiene mtodos adicionales para devolver slo los subconjuntos de los productos - GetProductByProductID ( productID ) ,GetProductsByCategoryID ( IdCategora ) , y GetProductsBySupplierID ( supplierID ) . Estos tres mtodos de esperar un parmetro de entrada que indica la manera de filtrar la informacin del producto devuelto. El ObjectDataSource se pueden utilizar para invocar mtodos que esperar los parmetros de entrada, pero para ello debemos especificar el lugar donde los valores de estos parmetros vienen. Los valores de los parmetros puede ser rgida o puede provenir de una variedad de fuentes dinmicas, entre ellas: los valores de cadena de consulta, las variables de sesin, el valor de la propiedad de un control de Web en la pgina, o para otros. Para este tutorial vamos a empezar por que muestran cmo utilizar un parmetro a un valor en el cdigo. En concreto, veremos la adicin de un DetailsView a la pgina que muestra informacin sobre un producto especfico, es decir, la mezcla Gumbo del chef Anton, que tiene un ProductID de 5. A continuacin, veremos cmo configurar el valor del parmetro sobre la base de un control web. En particular, vamos a utilizar un cuadro de texto para que el usuario escriba en un pas, despus de lo cual puede hacer clic en un botn para ver la lista de proveedores que residen en ese pas.

El uso de un valor de parmetro en el cdigo


Para el primer ejemplo, empezar por la adicin de un control DetailsView a la DeclarativeParams.aspx pgina en elBasicReporting carpeta. De la etiqueta inteligente del DetailsView, seleccione <Nuevo origen de datos> en la lista desplegable y elegir agregar un ObjectDataSource.

Figura 1. Aadir un ObjectDataSource a la pgina Se iniciar automticamente el control ObjectDataSource es asistente Elegir origen de datos. Seleccione la ProductsBLLclase a partir de la primera pantalla del asistente.

Figura 2. Seleccione la ProductsBLL clase Como queremos mostrar informacin sobre un producto en particular que desea utilizar el GetProductByProductID (productID ) mtodo.

Figura 3. Elija el GetProductByProductID ( productID ) mtodo Dado que el mtodo que hemos seleccionado incluye un parmetro, hay una pantalla ms para que el asistente, donde se nos pide que defina el valor que se utilizar para el parmetro. La lista de la izquierda muestra todos los parmetros para el mtodo seleccionado. Para GetProductByProductID ( productID ) slo hay una - productID . A la derecha se puede especificar el valor del parmetro seleccionado. El origen de parmetro en la lista desplegable enumera las distintas fuentes posibles para el valor del parmetro. Dado que queremos especificar un valor en el cdigo de 5 para el productID parmetro, deje la fuente de parmetros, como ninguno e introduzca 5 en el cuadro de texto DefaultValue.

Figura 4. Un valor de parmetro en el cdigo de 5 ser utilizado para la productID parmetros Despus de completar el asistente Configurar origen de datos, marcado declarativo del control ObjectDataSource incluye un parmetro de objeto en el SelectParameters coleccin para cada uno de los parmetros de entrada esperada por el mtodo definido en la SelectMethod propiedad. Dado que el mtodo que estamos usando en este ejemplo slo espera un parmetro de entrada, parameterID , slo hay una entrada aqu. El SelectParameterscoleccin puede contener cualquier clase que se deriva de la de parmetros de clase en laSystem.Web.UI.WebControls espacio de nombres. Para valores de los parmetros en el cdigo de la base de parmetros de clase se utiliza, pero para las opciones de fuente de otros parmetros derivados de un parmetroutilizado es la clase, tambin puede crear sus propios tipos de parmetros a medida , si es necesario.
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" SelectMethod = "GetProductByProductID" TypeName = "ProductsBLL"> <SelectParameters> <asp:Parameter DefaultValue="5" Name="productID" Type="Int32" /> </ SelectParameters> </ Asp: ObjectDataSource>

Nota Si va a seguir adelante en su propio ordenador el marcado declarativo que usted ve en este punto pueden incluir los valores de la InsertMethod , UpdateMethod , y DeleteMethod propiedades, as comoDeleteParameters . El ObjectDataSource elija Asistente de origen de datos automticamente especifica los mtodos de la ProductBLL utilizar para insertar, actualizar y eliminar, por lo menos que se elimina explcitamente esta prestacin, que sern incluidos en el formato anterior.

Al visitar esta pgina, el control web de datos llamar al de ObjectDataSource Seleccione el mtodo que se llame a laProductsBLL clase GetProductByProductID ( productID ) utilizando el mtodo de valor en el cdigo de 5 para elproductID parmetro de entrada. El mtodo devolver un establecimiento inflexible de tipos ProductDataTable objeto que contiene una sola fila con informacin acerca de Mix Gumbo del chef Anton (el producto con ProductID 5).

Figura 5. Informacin sobre la mezcla Gumbo del chef Anton es mostrado

Establecer el valor del parmetro al valor de la propiedad de un control de Web


El ObjectDataSource valores de los parmetros tambin se puede configurar en funcin del valor de un control de Web en la pgina. Para ilustrar esto, vamos a tener un GridView que muestra todos los proveedores que se encuentran en un pas determinado por el usuario. Para lograr esto comience a agregar un control TextBox a la pgina en la que el usuario puede introducir un nombre de pas. Establecer este control TextBox ID propiedad CountryName . Adems de agregar un control Web Button.

Figura 6. Agregar un control TextBox a la pgina con ID CountryName A continuacin, agregue un GridView a la pgina y, a partir de la etiqueta inteligente, optar por aadir un nuevo ObjectDataSource. Como queremos mostrar la informacin de seleccionar el proveedor SuppliersBLL clase a partir de la primera pantalla del asistente. Desde la segunda pantalla, escoger el GetSuppliersByCountry ( pas ) mtodo.

Figura 7. Elija el GetSuppliersByCountry ( pas ) Mtodo

Desde el GetSuppliersByCountry ( pas ) mtodo tiene un parmetro de entrada, el asistente una vez ms, incluye una pantalla final para elegir el valor del parmetro. Esta vez, establecer la fuente de los parmetros de control. Esto llenar la lista ControlID desplegable con los nombres de los controles de la pgina, seleccionar el CountryName el control de la lista. Cuando la pgina se visit por primera vez el CountryName TextBox aparecer en blanco, por lo que no se devuelven resultados y no se muestra. Si desea ver algunos de los resultados por defecto, cambie el cuadro de texto DefaultValue en consecuencia.

Figura 8. Establecer el valor del parmetro a la CountryName de control de valores Marcado declarativo del ObjectDataSource difiere un poco de nuestro primer ejemplo, utilizando un ControlParameteren lugar de los parmetros objeto. A ControlParameter tiene propiedades adicionales para especificar el ID del control Web y el valor de la propiedad que se utilizar para el parmetro ( PropertyName ). El asistente Configurar origen de datos fue lo suficientemente inteligente como para determinar que, por un cuadro de texto, probablemente querr usar el texto de propiedad para el valor del parmetro. Sin embargo, si desea utilizar un valor de propiedad distinta de la de control Web se puede cambiar el PropertyName valor aqu o pulsando el botn "Mostrar propiedades avanzadas" que aparece en el asistente.
<Asp: ObjectDataSource ID = "ObjectDataSource2" runat = "server" SelectMethod = "GetSuppliersByCountry" TypeName = "SuppliersBLL"> <SelectParameters> <Asp: ControlID ControlParameter = "CountryName" name = "pas" PropertyName = "Texto" Type = "String" /> </ SelectParameters> </ Asp: ObjectDataSource>

Al visitar la pgina por primera vez el CountryName TextBox est vaco. El ObjectDataSource Seleccione el mtodo sigue siendo invocada por el GridView, pero un valor de null se pasa a la GetSuppliersByCountry ( pas ) mtodo.El TableAdapter convierte el nulo en una base de datos NULL valor ( DBNull.Value ), pero la consulta utilizada por elGetSuppliersByCountry ( pas ) mtodo est escrito de tal manera que no devuelven ningn valor cuando un NULLse especifica un valor para el @ CategoryID parmetro. En resumen, no se devuelven los proveedores. Una vez que el visitante entra en un pas, sin embargo, y hace clic en el botn Mostrar Proveedores para causar una devolucin de datos, el de ObjectDataSource Seleccionar mtodo es nueva consulta, pasando el control TextBox Textovalor como el pas de los parmetros.

Figura 9. Los proveedores de Canad para aparecer

Mostrando todos los proveedores de forma predeterminada


En lugar de mostrar ninguno de los proveedores de la primera vez que ve la pgina que queramos mostrar todos losproveedores en un primer momento, lo que permite al usuario comparar la lista introduciendo un nombre de pas en el cuadro de texto. Cuando el cuadro de texto est vaco, el SuppliersBLL clase GetSuppliersByCountry ( pas )mtodo se pasa en un nulo valor para su pas, parmetro de entrada. Este nulo valor se transmite en el DALGetSupplierByCountry ( pas ) mtodo, que es traducido a una base de datos NULL valor para el pas @ parmetro en la siguiente consulta:
SELECCIONAR IdProveedor, CompanyName, Direccin, Ciudad, Pas, Telfono A partir de proveedores DONDE Pas = @ Pas

La expresin Pas = NULL devuelve siempre False, incluso para los registros cuyo pas tiene una columna NULL valor, por lo tanto, no se devuelven registros.

Para volver todos los proveedores, cuando el pas TextBox est vaco, podemos aumentar la GetSuppliersByCountry (pas ) en el mtodo de plomo en sangre para invocar la GetSuppliers () mtodo cuando su parmetro pas es nulay llamar a la DAL GetSuppliersByCountry ( pas ) el mtodo de lo contrario. Esto tendr el efecto de devolver a todos los proveedores que ningn pas se ha especificado, y el subconjunto apropiado de los proveedores cuando el parmetro pas est incluido. Cambiar el GetSuppliersByCountry ( pas ) en el mtodo SuppliersBLL clase a lo siguiente:
pblica Northwind.SuppliersDataTable GetSuppliersByCountry (pas de cuerda) { if (String.IsNullOrEmpty (pases)) GetSuppliers retorno (); ms volver Adapter.GetSuppliersByCountry (pas); }

Con este cambio la DeclarativeParams.aspx pgina muestra todos los proveedores, cuando visit por primera vez (o cada vez que el CountryName TextBox est vaco).

Figura 10. Todos los proveedores ahora se muestran por defecto

Resumen
Con el fin de utilizar los mtodos con parmetros de entrada, tenemos que especificar los valores de los parmetros en el ObjectDataSource SelectParameters coleccin. Diferentes tipos de parmetros de permitir el valor del parmetro que se obtiene de diferentes fuentes. El tipo de parmetro por defecto usa un valor en el cdigo, pero con la misma facilidad (y sin una lnea de cdigo) valores de los parmetros se pueden obtener de la

cadena de consulta, las variables de sesin, cookies, e incluso los valores introducidos por el usuario de los controles Web en la pgina. Los ejemplos que hemos visto en este tutorial se muestra cmo utilizar los valores del parmetro declarativo. Sin embargo, puede haber ocasiones en que tenemos que utilizar una fuente de parmetro que no est disponible, como la fecha y hora actuales, o bien, si nuestro sitio es mediante la suscripcin, el ID de usuario del visitante. Para estos escenarios se pueden establecer los valores de parmetros mediante programacin antes de que el mtodo ObjectDataSource invocar su objeto subyacente. Vamos a ver cmo lograr esto en el siguiente tutorial. Programacin feliz!

Tutorial 6: Configuracin de la programacin ObjectDataSource valores de los parmetros


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_6_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_6_CS.exe.

Contenido del Tutorial 6 (Visual C #) Introduccin Paso 1: Agregar un mtodo a EmployeesTableAdapter Paso 2: Agregar la GetEmployeesByHiredDateMonth (mes) Mtodo de la Capa de lgica de negocios Paso 3: Los empleados Viendo WhoseHiring aniversario es este mes Resumen

Introduccin
Como vimos en el tutorial anterior, un nmero de opciones estn disponibles para pasar de forma declarativa los valores de parmetros a los mtodos del ObjectDataSource. Si el valor del parmetro no es modificable, viene de un control de Web en la pgina, o en cualquier otra fuente que sea legible por una fuente de datos de parmetros de objeto, por ejemplo, que el valor puede estar sujeto a los parmetros de entrada, sin escribir una sola lnea de cdigo.

Puede haber ocasiones, sin embargo, cuando el valor del parmetro proviene de alguna fuente no representaba ya a uno de los incorporados en la fuente de datos de parmetros de objetos. Si nuestro sitio apoyado las cuentas de usuario que puede ser que desee establecer el parmetro sobre la base de la sesin iniciada en el ID de usuario visitante. O es posible que necesitemos personalizar el valor del parmetro antes de enviarlo junto con el mtodo de objeto subyacente del ObjectDataSource es. Cada vez que el ObjectDataSource Seleccione el mtodo que se invoca la primera ObjectDataSource plantea su evento Selecting . Se basa el mtodo de objeto ObjectDataSource es invocada. Una vez que complete la ObjectDataSourceseleccionada evento incendios (Figura 1 ilustra esta secuencia de eventos). Los valores de parmetro que se pasa en el mtodo del objeto subyacente ObjectDataSource se puede configurar o personalizar en un controlador de eventos para la seleccin de eventos.

Figura 1. El ObjectDataSource es seleccionada y Seleccin de fuego eventos anteriores y posteriores a su mtodo objeto subyacente se invoca En este tutorial veremos la adicin de un mtodo a nuestra DAL y BLL que acepta un solo parmetro de entrada - Mesde tipo int - y devuelve un EmployeesDataTable objeto poblado de aquellos empleados que tienen su aniversario de contratacin especificados en el mes . Nuestro ejemplo se establece este parmetro mediante programacin basado en el mes en curso, que muestra una lista de los "aniversarios de los empleados del mes". Vamos a empezar!

Paso 1: Agregar un mtodo a

EmployeesTableAdapter

Para nuestro primer ejemplo, tenemos que aadir un medio para recuperar aquellos empleados cuyo HireDate se produjo en un mes determinado. Para proporcionar esta funcionalidad, de acuerdo con nuestra arquitectura que tenemos que crear primero un mtodo en el EmployeesTableAdapter que se asigna a la correcta declaracin SQL. Para lograr

esto, empezar por abrir el conjunto de datos con tipo Neptuno. Haga clic derecho en el EmployeesTableAdapteretiqueta y elija Agregar consulta.

Figura 2. Aadir una nueva consulta a la EmployeesTableAdapter Optar por aadir una instruccin SQL que devuelve filas. Al llegar a la Especifique un SELECT de la pantalla por defecto de la Declaracin SELECCIONAR declaracin de la EmployeesTableAdapter ya estar cargado. Slo tienes que aadir en el DONDE clusula: DONDE DATEPART (m, HireDate) = @ mes . DATEPART es una funcin de T-SQL que devuelve una parte de una fecha determinada fecha y hora de tipo, en este caso estamos utilizando DATEPART para devolver el mes de la Fecha de contratacin de la columna.

Figura 3. Devuelva slo los registros en que los HireDate columna es menor que o igual a la HiredBeforeDate @parmetro Por ltimo, cambiar el FillBy y GetDataBy nombres de los mtodos de FillByHiredDateMonth yGetEmployeesByHiredDateMonth , respectivamente.

Figura 4. Elegir nombres de los mtodos ms apropiados que FillBy y GetDataBy Haga clic en Finalizar para completar el asistente y volver a la superficie de diseo del DataSet. ElEmployeesTableAdapter ahora debe incluir un nuevo conjunto de mtodos para acceder a los empleados contratados en un mes determinado.

Figura 5. Los nuevos mtodos aparecen en la superficie de diseo del DataSet

Paso 2: Agregar la GetEmployeesByHiredDateMonth la capa de lgica de negocios

( mes )

Mtodo de

Desde nuestra arquitectura de la aplicacin utiliza una capa separada de la lgica de negocio y la lgica de acceso a datos, tenemos que aadir un mtodo a nuestra BLL, que llama a la DAL para recuperar los empleados contratados antes de una fecha determinada. Abra el EmployeesBLL.cs y agregue el siguiente mtodo:
[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, false)] pblica Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth (int mes) { volver Adapter.GetEmployeesByHiredDateMonth (mes); }

Al igual que con nuestros mtodos de esta clase, GetEmployeesByHiredDateMonth ( meses ) simplemente llama a abajo en el DAL y devuelve los resultados.

Paso 3: Visualizacin de los empleados WhoseHiring aniversario es este mes

El paso final de este ejemplo es para mostrar aquellos empleados cuya contratacin aniversario este mes. Comience por la adicin de un GridView a la ProgrammaticParams.aspx pgina en el BasicReporting carpeta y aadir un nuevo ObjectDataSource como origen de datos. Configurar el ObjectDataSource para utilizar el EmployeesBLL clase con elSelectMethod establecido en GetEmployeesByHiredDateMonth ( meses ) .

Figura 6. Utilice el EmployeesBLL clase

Figura 7. Seleccione Desde el GetEmployeesByHiredDateMonth ( meses ) mtodo La ltima pantalla nos pide que nos proporcionan los meses el valor del parmetro de la fuente. Puesto que vamos a establecer este valor mediante programacin, dejan la fuente de los parmetros establecidos para la opcin Ninguno predeterminado y haga clic en Finalizar.

Figura 8. Deje el Origen de los parmetros establecido en Ninguno Esto crear un parmetro de objeto en el ObjectDataSource SelectParameters coleccin que no tiene un valor especificado.
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" OldValuesParameterFormatString = "original_ {0}" SelectMethod = "GetEmployeesByHiredDateMonth" TypeName = "EmployeesBLL"> <SelectParameters> <asp:Parameter Name="month" Type="Int32" /> </ SelectParameters> </ Asp: ObjectDataSource>

Para establecer este valor mediante programacin, es necesario crear un controlador de eventos para el ObjectDataSource Seleccin de eventos. Para lograr esto, vaya a la vista Diseo y haga doble clic en el ObjectDataSource. Tambin puede seleccionar el ObjectDataSource, vaya a la ventana Propiedades, y haga clic en el icono de rayo. A continuacin, haga doble clic en el cuadro de texto junto a la Seleccin de evento o escriba el nombre del controlador de eventos que desee utilizar.

Figura 9. Haga clic en el icono de rayo en la ventana Propiedades de la lista de eventos de un control web Ambos enfoques agregar un nuevo controlador de eventos para el ObjectDataSource Seleccin de eventos para el cdigo subyacente de la pgina de la clase. En este controlador de eventos que pueden leer y escribir a los valores de los parmetros utilizando e.InputParameters [ parameterName ] , donde parameterName es el valor del nombre de atributo en la <asp:Parameter> archivo ( InputParameters coleccin tambin puede ser indexado de forma ordinal, como en e.InputParameters [ ndice ] ). Para establecer el mes de parmetros para el mes en curso, aada lo siguiente a la Seleccin de controlador de eventos:
protected void ObjectDataSource1_Selecting (object sender, ObjectDataSourceSelectingEventArgs e) { e.InputParameters ["mes"] = DateTime.Now.Month; }

Al visitar esta pgina a travs de un navegador, podemos ver que un solo empleado fue contratado este mes (marzo) - Laura Callahan, que ha estado con la compaa desde 1994.

Figura 10. Aquellos empleados cuyos aniversarios de este mes aparecen

Resumen
Mientras que valores de los parmetros del ObjectDataSource 'tpicamente pueden establecerse mediante declaracin, sin necesidad de una lnea de cdigo, es fcil de configurar los valores de parmetros mediante programacin. Todo lo que necesitamos hacer es crear un controlador de eventos para el ObjectDataSource Seleccin de eventos, que se dispara antes de que el mtodo del objeto subyacente se invoca, y establecer manualmente los valores de uno o ms parmetros a travs de la InputParameters coleccin. En este tutorial se concluye la seccin de Informacin Bsica. El siguiente tutorial se inicia la seccin de filtrado y Maestro-Detalles de los escenarios, en el que veremos las tcnicas para que el visitante pueda filtrar los datos y ver los detalles de un informe de maestro en un informe de los detalles. Programacin feliz!

Tutorial 7: Maestro / Detalle de filtrado con un DropDownList


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_7_CS.exe cdigo de ejemplo.

Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_7_CS.exe.

Contenido del Tutorial 7 (Visual C #) Introduccin Paso 1: Visualizacin de las categoras en un DropDownList Paso 2: Agregar el GridView Productos Resumen

Introduccin
Un tipo comn de informe es el informe maestro / detalle , en la que el informe comienza por mostrar un conjunto de "maestro" registros. El usuario puede profundizar en uno de los registros maestros, con lo que ver que registro maestro de "detalles". Maestro / detalle los informes son una opcin ideal para la visualizacin de las relaciones uno-a-muchos, como un informe que muestra todas las categoras y que permite al usuario seleccionar una categora en particular y mostrar sus productos asociados. Adems, el maestro / detalle los informes son tiles para mostrar informacin detallada de todo "ancho" tablas (los que tienen una gran cantidad de columnas). Por ejemplo, el "maestro" a nivel de un informe maestro / detalle puede mostrar slo el nombre del producto y el precio unitario de los productos en la base de datos, y la perforacin hacia abajo en un producto en particular se muestran los campos de productos adicionales (categora, proveedor, la cantidad por unidad, y as sucesivamente). Hay muchas maneras con las que puede ser un informe maestro / detalle implementado. Durante este y los tutoriales siguientes tres vamos a ver una variedad de informes de maestro / detalle. En este tutorial vamos a ver cmo se muestran los registros maestros en un control DropDownList y los detalles del elemento de la lista seleccionada en un GridView. En particular, este tutorial de maestro / detalle informe lista de categoras y productos.

Paso 1: Visualizacin de las categoras en un DropDownList


Nuestro maestro / detalle el informe mostrar una lista de las categoras en un DropDownList, con los productos del elemento de la lista seleccionada se muestra ms abajo en la pgina en un GridView. La primera tarea por delante de nosotros, entonces, es que las categoras mostradas en una lista desplegable. Abra el FilterByDropDownList.aspxpgina en el filtrado de carpeta, arrastre en un DropDownList desde el Cuadro de herramientas al diseador de la pgina, y establecer su identificacin de la propiedad de las categoras . A continuacin, haga clic en el enlace Elegir origen de datos de la etiqueta inteligente del DropDownList. Esto mostrar el origen de datos del asistente de configuracin.

Figura 1. Especificar origen de datos de la DropDownList Optar por aadir un nuevo ObjectDataSource llamado CategoriesDataSource que invoca el CategoriesBLL claseGetCategories () mtodo.

Figura 2. Agregar un nuevo ObjectDataSource nombre CategoriesDataSource

Figura 3. Optar por utilizar el CategoriesBLL clase

Figura 4. Configurar el ObjectDataSource Utilizar el GetCategories () Mtodo Despus de configurar el ObjectDataSource todava tenemos que especificar qu campo de datos de origen se debe mostrar en DropDownList y que se debe asociar el valor del elemento de lista. Tienen la CategoryName campo como la pantalla y CategoryID como el valor de cada elemento de la lista.

Figura 5. Tienen el DropDownList Mostrar el CategoryName campo y el uso CategoryID como el valor En este momento tenemos un control DropDownList que se rellena con los registros de la Categoras de mesa (todo se logr en unos seis segundos). La figura 6 muestra nuestro progreso hasta ahora cuando se ve a travs de un navegador.

Figura 6. Un listas desplegables las categoras actuales

Paso 2: Agregar el GridView Productos


Este ltimo paso en nuestro maestro / detalle del informe es hacer una lista de los productos asociados con la categora seleccionada. Para lograr esto, agregar un GridView a la pgina y crear un nuevo llamado ObjectDataSourceproductsDataSource . Tienen la productsDataSource sacrificio controlar sus datos de la ProductsBLL claseGetProductsByCategoryID ( IdCategora ) mtodo.

Figura 7. Seleccione la GetProductsByCategoryID ( IdCategora ) Mtodo Despus de elegir este mtodo, el asistente ObjectDataSource nos pide el valor para el mtodo de categoryIDparmetro. Para utilizar el valor de los seleccionados categoras punto DropDownList establecer el origen de los parmetros para el Control y la ControlID de Categoras .

Figura 8. Establecer el IdCategora parmetro en el valor de las Categoras DropDownList Tmese un momento para ver nuestro progreso en un navegador. La primera vez que visita la pgina, los productos pertenecen a la categora seleccionada (Bebidas) se muestran (como se muestra en la Figura 9), pero cambiando el DropDownList no actualiza los datos. Esto se debe a una devolucin de datos debe ocurrir para que el control GridView para actualizar. Para lograr esto tenemos dos opciones (ninguno de los cuales es necesario escribir ningn cdigo):

Establecer el DropDownList categoras de propiedad AutoPostBack en True. (Esto se puede hacer seleccionando la opcin Habilitar AutoPostBack en la etiqueta inteligente del DropDownList.) Esto dar lugar a una devolucin de datos cuando el elemento seleccionado del control DropDownList es cambiado por el usuario.Por lo tanto, cuando el usuario selecciona una nueva categora de la DropDownList una devolucin de datos se producir y el GridView se actualiza con los productos de la categora que acaba de seleccionar. (Este es el mtodo que he utilizado en este tutorial.) Agregue un control Web Button al lado de la lista desplegable. Establezca su texto para actualizar la propiedad o algo similar. Con este enfoque, el usuario tendr que seleccionar una nueva categora y haga clic en el botn. Al hacer clic en el botn har una devolucin de datos y actualizar el GridView a la lista de los productos de la categora seleccionada.

Las figuras 9 y 10 ilustran el informe maestro / detalle en la accin.

Figura 9. La primera vez que visita la pgina, los productos de bebida es mostrado

Figura 10. Seleccin de un nuevo producto (Produce) automticamente causa un PostBack, Actualizacin del GridView

Adicin de una "- Seleccione una categora -" elemento de lista


La primera vez que visita la FilterByDropDownList.aspx pgina del artculo de la DropDownList categoras de la primera lista (de consumo) est seleccionada por defecto, que muestra los productos de bebidas en el GridView. En lugar de mostrar los productos de la primera categora, nos puede querer tener lugar un elemento seleccionado de DropDownList que dice algo como, "- Seleccione una categora -". Para agregar un nuevo elemento de lista a la DropDownList, vaya a la ventana Propiedades y haga clic en los puntos suspensivos en los elementos de la propiedad. Aadir un nuevo elemento de lista con el texto "- Seleccione una categora -" y el valor -1 .

Figura 11. Aadir a "- Elegir una categora -" elemento de lista Alternativamente, usted puede agregar el elemento de la lista, aadiendo el siguiente marcado de la DropDownList:
<Asp: DropDownList ID = "categoras" runat = "server" AutoPostBack = "True" DataSourceID = "categoriesDataSource" DataTextField = "CategoryName" DataValueField = "CategoryID" EnableViewState = "false"> <asp:ListItem Value="-1"> - Elija una Categora - </ asp: ListItem> </ Asp: DropDownList>

Adems, necesitamos establecer el control DropDownList AppendDataBoundItems en True, porque cuando las categoras estn obligados a la DropDownList desde el ObjectDataSource que van a sobrescribir los elementos de la lista manualmente aadido si AppendDataBoundItems no es cierto.

Figura 12. Establecer el AppendDataBoundItems propiedad en True Despus de estos cambios, la primera vez que visita la pgina del "- Seleccione una categora -" est seleccionada y no son productos que se muestran.

Figura 13. En la pgina inicial de carga de productos se muestran No La razn no se muestran cuando los productos debido a que el "- Seleccione una categora -" elemento de la lista se selecciona se debe a que su valor es -1 y no hay productos en la base de datos con un CategoryID de -1 . Si este es el comportamiento que usted desea, luego que haya terminado en este momento! Sin embargo, si desea mostrar todos losde las categoras cuando el "- Seleccione una categora -" elemento de la lista est

seleccionado, vuelva a laProductsBLL clase y personalizar el GetProductsByCategoryID ( IdCategora ) el mtodo para que se invoca elGetProducts () mtodo si el pasado en categoryID parmetro es menor que cero:
pblica Northwind.ProductsDataTable GetProductsByCategoryID (int categoryID) { if (IdCategora <0) GetProducts retorno (); ms volver Adapter.GetProductsByCategoryID (IdCategora); }

La tcnica utilizada es similar al enfoque que se utiliza para mostrar a todos los proveedores de vuelta en el tutorial de parmetros declarativa , aunque en este ejemplo estamos usando un valor de -1 para indicar que todos los registros deben ser recuperados en lugar de nulo . Esto se debe a la categoryID parmetro de la GetProductsByCategoryID (IdCategora ) mtodo espera como valor entero que se pasa en, mientras que en el tutorial de parmetros declarativa que pasaban en un parmetro de la cadena de entrada. La figura 14 muestra una captura de pantalla de FilterByDropDownList.aspx cuando el "Seleccione una categora -" est seleccionada. Aqu, todos los productos se muestran por defecto y el usuario puede reducir la pantalla eligiendo una categora especfica.

Figura 14. Todos los productos estn ahora aparece de forma predeterminada

Resumen
Cuando se muestran los datos jerrquicamente relacionados, a menudo ayuda a presentar los datos con maestro / detalle los informes, de los cuales el usuario puede comenzar de

leer los datos desde la parte superior de la jerarqua y profundizar en los detalles. En este tutorial vamos a examinar la construccin de una simple relacin maestro / detalles del informe que muestra los productos de una categora seleccionada. Esto se logr mediante el uso de un DropDownList para la lista de categoras y un GridView para los productos que pertenecen a la categora seleccionada. En el siguiente tutorial vamos a tomar la interfaz DropDownList un paso ms all, utilizando dos DropDownLists. Programacin feliz!

Tutorial 8: Maestro / Detalle de filtrado con dos DropDownLists


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_8_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_8_CS.exe.

Contenido del Tutorial 8 (Visual C #) Introduccin Paso 1: Crear y llenar el control DropDownList Categoras Paso 2: Visualizacin de los productos de la categora seleccionada en un DropDownList Segundo Paso 3: El uso de un DetailsView para mostrar los detalles para el producto seleccionado Resumen

Introduccin
En el tutorial anterior se analiz cmo mostrar un maestro sencillo / detalles del informe con un DropDownList nico poblado de las categoras y un GridView que muestra los productos que pertenecen a la categora seleccionada. Este modelo funciona bien cuando se informe mostrando los registros que tienen una relacin uno a muchos y puede ampliarse fcilmente para trabajar en escenarios que incluyen mltiples relaciones uno-amuchos. Por ejemplo, un sistema de entrada de pedidos que tiene tablas que corresponden a clientes, pedidos y lneas de pedido. Un cliente determinado puede tener varios pedidos con cada pedido que consta de varios elementos. Estos datos pueden ser presentados al usuario con dos DropDownLists y un GridView. El DropDownList primero tendra un elemento de la lista para cada cliente en la base de datos con el contenido de la segunda

es que los pedidos de los clientes seleccionados.Un GridView que la lista de artculos de lnea de la orden seleccionada. Aunque la base de datos Northwind incluye el cliente cannica / pedido / informacin de detalles en su clientes ,pedidos y detalles del pedido tablas, estas tablas no se refleja en nuestra arquitectura. Sin embargo, todava puede ilustrar con dos DropDownLists dependientes. El DropDownList primera lista de las categoras y el segundo de los productos que pertenecen a la categora seleccionada. A continuacin, aparecer una lista DetailsView los detalles del producto seleccionado.

Paso 1: Crear y llenar el control DropDownList Categoras


Nuestro primer objetivo es agregar el control DropDownList que se enumeran las categoras. Estas medidas se examinarn en detalle en el tutorial anterior, pero se resumen aqu para completar. Abra el MasterDetailsDetails.aspx pgina en el filtrado de carpeta, agregue un DropDownList a la pgina, configurar su ID de propiedad de las categoras , a continuacin, haga clic en el enlace Configurar datos de origen en su etiqueta inteligente. Desde el Asistente para configuracin de orgenes de datos optar por aadir una nueva fuente de datos.

Figura 1. Aadir un nuevo origen de datos para el DropDownList

La nueva fuente de datos debe, naturalmente, ser un ObjectDataSource. El nombre de este nuevo ObjectDataSourceCategoriesDataSource y tienen que invocar el CategoriesBLL objeto GetCategories () mtodo.

Figura 2. Optar por utilizar el CategoriesBLL clase

Figura 3. Configurar el ObjectDataSource Utilizar el GetCategories () Mtodo Despus de configurar el ObjectDataSource todava tenemos que especificar qu campo de datos de origen se debe mostrar en la Categoras DropDownList y que uno debe estar configurado como el valor del elemento de la lista.Establecer el CategoryName campo como la pantalla y CategoryID como el valor de cada elemento de la lista.

Figura 4. Tienen el DropDownList Mostrar el CategoryName campo y el uso CategoryID como el valor En este momento tenemos un control DropDownList ( categoras ) que se rellena con los registros de la Categorasde mesa. Cuando el usuario elige una nueva categora de la DropDownList vamos a querer una devolucin de datos que se produzcan con el fin de actualizar la DropDownList producto que vamos a crear en el paso 2. Por lo tanto, marcar la opcin Habilitar AutoPostBack de la categora de etiquetas inteligentes DropDownList.

Figura 5. Habilitar AutoPostBack para la Categoras DropDownList

Paso 2: Visualizacin de los productos de la categora seleccionada en un DropDownList segundo


Con la Categoras DropDownList completado, el siguiente paso es mostrar un DropDownList de los productos que pertenecen a la categora seleccionada. Para lograr esto, aadir otro DropDownList a la pgina denominadaProductsByCategory . Al igual que con las Categoras DropDownList, crear un nuevo ObjectDataSource para elProductsByCategory DropDownList llamado ProductsByCategoryDataSource .

Figura 6. Aadir un nuevo origen de datos para el ProductsByCategory DropDownList

Figura 7. Crear un nuevo ObjectDataSource nombre ProductsByCategoryDataSource

Desde el ProductsByCategory DropDownList necesita mostrar slo los productos que pertenecen a la categora seleccionada, tiene la ObjectDataSource invocar la GetProductsByCategoryID ( IdCategora ) mtodo de laProductsBLL objeto.

Figura 8. Optar por utilizar el ProductsBLL clase

Figura 9. Configurar el ObjectDataSource Utilizar el GetProductsByCategoryID ( IdCategora ) Mtodo En el ltimo paso del asistente es necesario especificar el valor de la categoryID parmetro. Asigne a este parmetro para el elemento seleccionado de la Categoras DropDownList.

Figura 10. Tire de la categoryID valor del parmetro de las Categoras DropDownList Con el ObjectDataSource configurado, lo nico que queda es para especificar qu campos de datos de origen se utilizan para la visualizacin y el valor de los elementos del DropDownList. Mostrar el ProductName campo y utilizar elProductID campo como valor.

Figura 11. Especificar los campos de fuente de datos utilizada para el DropDownList ListItem s ' Texto y Valor delas propiedades Con el ObjectDataSource y ProductsByCategory DropDownList configurado nuestra pgina mostrar dos DropDownLists: la primera lista de todas las categoras, mientras que la segunda mostrar una lista de los productos que pertenecen a la categora seleccionada. Cuando el usuario selecciona una nueva categora de la DropDownList en primer lugar, una devolucin de datos se producir y el DropDownList segundo ser de rebote, que muestra los productos que pertenecen a la categora que acaba de seleccionar. Figuras 12 y 13 muestranMasterDetailsDetails.aspx en accin cuando se ve a travs de un navegador.

Figura 12. La primera vez que visita la pgina, la categora de bebidas se selecciona

Figura 13. Elegir una categora diferente Muestra de Productos de la nueva categora de Actualmente, el productsByCategory DropDownList, si se cambian, no , no causa una devolucin de datos. Sin embargo, queremos que se produzca una devolucin de datos una vez que aadimos un DetailsView para mostrar los detalles del producto seleccionado (paso 3). Por lo tanto, marca la casilla Habilitar AutoPostBack del productsByCategory etiqueta inteligente DropDownList.

Figura 14. Activar la funcin de AutoPostBack para el productsByCategory DropDownList

Paso 3: El uso de un DetailsView para mostrar los detalles del producto seleccionado
El ltimo paso consiste en mostrar los detalles para el producto seleccionado en un DetailsView. Para lograr esto, agregue un DetailsView a la pgina, configurar su ID de la propiedad Detalles del producto , y crear un nuevo ObjectDataSource para ello. Configurar este ObjectDataSource a retirar sus datos de la ProductsBLL claseGetProductByProductID ( productID ) mtodo que utiliza el valor seleccionado de la ProductsByCategoryDropDownList para el valor de la productID parmetro.

Figura 15. Optar por utilizar el ProductsBLL clase

Figura 16. Configurar el ObjectDataSource Utilizar el GetProductByProductID ( productID ) Mtodo

Figura 17. Tire de la productID valor del parmetro de la ProductsByCategory DropDownList Usted puede optar por presentar cualquiera de los campos disponibles en el DetailsView. He optado por quitar elProductID , IdProveedor y CategoryID campos y reordenar y dar formato a los campos restantes. Adems, me limpi el DetailsView de altura y ancho de las propiedades, permitiendo que el DetailsView para ampliar el ancho necesario para mostrar sus mejores datos en lugar de tener que limita a un tamao especificado. El marcado completo aparece a continuacin:
<Asp: DetailsView ID = "Detalles del producto" runat = "server" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" EnableViewState = "false"> <Fields> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" /> <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" /> <Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio" HtmlEncode = "false" SortExpression = "UnitPrice" /> <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="Units En Stock" />

<asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="Units En Order" /> <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="Reorder Level" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> </ Campos> </ Asp: DetailsView>

Tmese un momento para probar el MasterDetailsDetails.aspx pgina en un navegador. A primera vista puede parecer que todo est funcionando como se desee, pero hay un problema sutil. Cuando se elige una nueva categora de la ProductsByCategory DropDownList se actualiza para incluir los productos de la categora seleccionada, pero losDetalles del producto DetailsView sigui mostrando la informacin del producto anterior. El DetailsView se actualiza la hora de elegir un producto diferente para la categora seleccionada. Adems, si se prueba suficientemente a fondo, usted encontrar que si usted elige continuamente nuevas categoras (como la eleccin de las bebidas de lascategoras DropDownList, a continuacin, condimentos, luego Confecciones) cada seleccin de categora de otras causas de la Detalles del producto DetailsView se actualice. Para ayudar a concretar este problema, veamos un ejemplo concreto. La primera vez que visita la pgina de la categora de bebidas se ha seleccionado y los productos relacionados se cargan en el ProductsByCategory DropDownList. Chai es el producto seleccionado y sus detalles se muestran en los Detalles del producto DetailsView, como se muestra en la Figura 18.

Figura 18. Detalles del producto seleccionado se muestran en un DetailsView

Si cambia la seleccin de categoras de bebidas de condimentos, se produce una devolucin de datos y laProductsByCategory DropDownList se actualiza en consecuencia, pero todava DetailsView muestra los detalles de Chai.

Figura 19. Detalles del producto previamente seleccionado se sigue mostrando Elegir un nuevo producto de que se actualice la lista de los DetailsView como se esperaba. Si tienes que elegir una nueva categora despus de cambiar el producto, el DetailsView de nuevo, no se actualizar. Sin embargo, si en lugar de elegir un nuevo producto que ha seleccionado una nueva categora, la actualizacin se DetailsView. Lo que en el mundo que est pasando aqu? El problema es un problema de sincronizacin del ciclo de vida de la pgina. Cada vez que se solicita una pgina que procede a travs de una serie de medidas como su representacin. En uno de estos pasos los controles ObjectDataSource comprobar para ver si alguno de sus SelectParameters valores han cambiado. Si es as, el control de elementos Web enlazado a datos a los ObjectDataSource sabe que necesita para actualizar su pantalla. Por ejemplo, cuando una nueva categora se selecciona, el ProductsByCategoryDataSource ObjectDataSource detecta que sus valores de los parmetros han cambiado y la ProductsByCategory DropDownList se vuelve a enlazar, conseguir los productos de la categora seleccionada. El problema que surge en esta situacin es que el punto en el ciclo de vida de la pgina que la ObjectDataSources comprobar los parmetros modificados se produce antes de la reconsolidacin de los controles web de datos asociado.Por lo tanto, al seleccionar una nueva categora de la ProductsByCategoryDataSource ObjectDataSource detecta un cambio en el valor de su parmetro. El ObjectDataSource utiliza el Detalles del producto DetailsView,

sin embargo, no se nota cualquiera de estos cambios ya que el ProductsByCategory DropDownList an no ha sido de rebote. Ms tarde en el ciclo de vida de la ProductsByCategory DropDownList vuelve a enlazar con su ObjectDataSource, tomando los productos de la categora que acaba de seleccionar. Mientras que el ProductsByCategory valor DropDownList ha cambiado, el Detalles del producto DetailsView de ObjectDataSource ya ha hecho su cheque el valor del parmetro, por lo tanto, el DetailsView muestra sus resultados anteriores. Esta interaccin se ilustra en la Figura 20.

Figura 20. El ProductsByCategory cambios DropDownList valor despus de la Detalles del producto DetailsView de ObjectDataSource busca cambios Para solucionar este problema tenemos que volver a vincular explcitamente el Detalles del producto DetailsView despus de la ProductsByCategory DropDownList se ha obligado. Podemos lograr esto mediante una llamada alDetalles del producto DetailsView de DataBind () cuando el mtodo ProductsByCategory DropDownListDataBound activa el evento. Agregue el cdigo de controlador de eventos siguiente a la MasterDetailsDetails.aspxclase de cdigo subyacente pgina (consulte Ajuste de la programacin ObjectDataSource valores de los parmetrospara una discusin acerca de cmo agregar un controlador de eventos):
protected void ProductsByCategory_DataBound (object sender, EventArgs e) { ProductDetails.DataBind (); }

Despus de esta llamada explcita a los Detalles del producto DetailsView de DataBind () mtodo se ha aadido, el tutorial funciona como se espera. Figura 21 pone de relieve cmo esta situacin cambi remediar nuestro problema antes.

Figura 21. Los Detalles del producto DetailsView est explcitamente se renueva cuando la ProductsByCategoryDropDownList DataBound evento se activa

Resumen
El DropDownList sirve como un elemento de interfaz de usuario ideal para los informes de maestro / detalle, donde hay una relacin uno-a-muchos entre el maestro y los registros de detalle. En el tutorial anterior vimos cmo utilizar un solo DropDownList para filtrar los productos exhibidos por la categora seleccionada. En este tutorial hemos reemplazado el GridView de productos con un DropDownList, y utiliz un DetailsView para mostrar los detalles del producto seleccionado. Los conceptos discutidos en este tutorial se puede extender fcilmente a los modelos de datos que implican mltiples relaciones uno-amuchos, tales como clientes, pedidos y artculos de la orden. En general, siempre se puede aadir un DropDownList para cada uno de los "uno" entidades en las relaciones uno-amuchos. Programacin feliz!

Tutorial 9: Maestro / Detalle de filtrado en dos pginas


Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_9_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_9_CS.exe.

Contenido del Tutorial 9 (Visual C #) Introduccin Paso 1: Agregar pginas SupplierListMaster.aspx y ProductsForSupplierDetails.aspx a la carpeta de Filtros Paso 2: Visualizacin de la lista de proveedores SupplierListMaster.aspx Paso 3: Listado de los productos del proveedor en ProductsForSupplierDetails.aspx Resumen

Introduccin
En los ltimos dos tutoriales vimos cmo mostrar maestro / detalle los informes en una nica pgina web con DropDownLists para mostrar el "maestro" de registros y un control GridView o DetailsView para mostrar los "detalles".Otro patrn comn utilizado para los informes de maestro / detalle es que los registros maestros en una pgina Web y los datos que aparecen en otro. Una pgina web del foro, como el Foro ASP.NET , es un gran ejemplo de este patrn en la prctica. En los foros de ASP.NET se compone de una variedad de foros - Primeros pasos, formularios web, controles de datos de presentacin, y as sucesivamente. Cada foro est compuesto de muchos hilos y cada hilo se compone de un nmero de puestos. En la pgina principal ASP.NET Forums, los foros estn en la lista. Al hacer clic en un foro te lleva a un ShowForum.aspx pgina, que muestra los hilos de ese foro. Del mismo modo, al hacer clic en un hilo te lleva a ShowPost.aspx , que muestra los mensajes en el hilo que se hizo clic. En este tutorial vamos a poner en prctica este modelo mediante el uso de un GridView a la lista de los proveedores en la base de datos. Cada fila de proveedores en el GridView contiene un enlace Ver los productos que, al hacer clic, llevar al usuario a otra pgina que enumera los productos que el proveedor seleccionado.

Paso 1: Agregar SupplierListMaster.aspx yProductsForSupplierDetails.aspx Pginas para el filtrado de la carpeta

Al definir el diseo de pgina en el tercer tutorial hemos aadido una serie de "arranque" las pginas de laBasicReporting , filtrado , y CustomFormatting carpetas. Sin embargo, no aadimos una pgina de inicio para este tutorial en ese momento, as que tome un momento para agregar dos nuevas pginas la lista de "maestro" registros (los proveedores), mientras que ProductsForSupplierDetails.aspx mostrar los productos para el proveedor seleccionado. Al crear estas dos nuevas pginas para tener la certeza de los asocian con el Site.master pgina principal.

Figura 1. Agregue el SupplierListMaster.aspx y ProductsForSupplierDetails.aspx pginas al filtrado de la carpeta Adems, al aadir nuevas pginas al proyecto, asegrese de actualizar el archivo de mapa del sitio, Web.sitemap , en consecuencia. Para este tutorial slo tiene que aadir SupplierListMaster.aspx pgina para el mapa del sitio con el contenido XML siguiente como un nio de los informes de filtrado <siteMapNode> elemento:
<SiteMapNode url = "~ / Filtros / SupplierListMaster.aspx" title = "Maestro / Detalle en dos pginas" description = "Los registros maestros en una pgina, los registros de detalles en otra." />

Nota Usted puede ayudar a automatizar el proceso de actualizacin del archivo de mapa del sitio al agregar nuevas pginas ASP.NET con K. Scott Allen 's gratis Visual Studio Mapa del Sitio Macro .

Paso 2: Visualizacin de la lista de proveedores SupplierListMaster.aspx

Con la SupplierListMaster.aspx y ProductsForSupplierDetails.aspx pginas creadas, el siguiente paso es crear el GridView de los proveedores en SupplierListMaster.aspx . Aadir un GridView a la pgina y se unen a un nuevo ObjectDataSource. Este ObjectDataSource debe utilizar el SuppliersBLL clase GetSuppliers () para devolver a todos los proveedores.

Figura 2. Seleccione la SuppliersBLL clase

Figura 3. Configurar el ObjectDataSource Utilizar el GetSuppliers () Mtodo Tenemos que incluir un enlace titulado Productos Ver en cada fila GridView que, al hacer clic, lleva al usuario aProductsForSupplierDetails.aspx pasar en la fila seleccionada IdProveedor valor a travs de la cadena de consulta.Por ejemplo, si el usuario hace clic en el enlace Ver Productos para el proveedor de Tokio comerciantes (que tiene unIdProveedor valor de 4), deben ser enviados a ProductsForSupplierDetails.aspx? IdProveedor = 4 . Para lograr esto, agregue una HyperLinkField al GridView, lo que aade un hipervnculo a cada fila de GridView. Empiece haciendo clic en el enlace Editar columnas de la etiqueta inteligente del GridView. A continuacin, seleccione la HyperLinkField de la lista en la parte superior izquierda y haga clic en Aadir para incluir la lista de campos HyperLinkField en el GridView.

Figura 4. Aadir un HyperLinkField al GridView El HyperLinkField puede ser configurado para utilizar el mismo texto o valores de la URL del enlace en cada fila GridView, o puede basar estos valores en los datos de los valores lmite para cada fila en particular. Para especificar un valor esttico en todas las filas de utilizar el HyperLinkField de texto o NavigateUrl propiedades. Como queremos que el texto del enlace sea el mismo para todas las filas, defina el HyperLinkField de texto propiedad para ver los productos.

Figura 5. Establecer el HyperLinkField de texto Propiedad para ver los productos Para establecer los valores de texto o URL que se basan en los datos subyacentes vinculados a la fila de GridView, especificar los campos de datos, los valores de texto o direccin URL debe ser retirado de la DataTextField oDataNavigateUrlFields propiedades. DataTextField slo se puede establecer a un nico campo de datos ;DataNavigateUrlFields , sin embargo, se puede establecer en una lista separada por comas de los campos de datos.Con frecuencia necesidad de basar el texto o la URL de una combinacin del valor de la fila actual de datos de campo y algunas marcas estticas. En este tutorial, por ejemplo, queremos que las URL de los vnculos del HyperLinkField a serProductsForSupplierDetails.aspx? IdProveedor = supplierID , donde supplierID cada fila GridView es elIdProveedor valor. Tenga en cuenta que necesitamos valores estticos y manejo de datos-en este caso: laProductsForSupplierDetails.aspx IdProveedor =? parte de la URL del enlace es esttico, mientras que elsupplierID parte es basada en datos como su valor es cada fila de la propia IdProveedor valor. Para indicar una combinacin de valores estticos y controladas por datos, utilice el DataTextFormatString yDataNavigateUrlFormatString propiedades. En estas propiedades entrar en el marcado esttico como sea necesario y luego usar el marcador {0} , donde desea que el valor del campo especificado en la DataTextField oDataNavigateUrlFields propiedades aparezcan. Si el DataNavigateUrlFields propiedad tiene reas de uso mltiple especificado {0} donde desea que el valor del campo introduce por primera vez, {1} para el valor del campo en segundo lugar, y as sucesivamente. Aplicando esto a nuestro tutorial, es necesario establecer el DataNavigateUrlFields propiedad IdProveedor , ya que es el campo de datos cuyo valor

tenemos que personalizar en una fila por fila, y el DataNavigateUrlFormatStringpropiedad ProductsForSupplierDetails.aspx? IdProveedor = {0} .

Figura 6. Configurar el HyperLinkField para incluir el URL del enlace adecuada, basndose en el IdProveedor Despus de aadir el HyperLinkField, no dude en modificar y reordenar los campos del GridView. El marcado siguiente se muestra el control GridView despus de que he hecho algunas pequeas adaptaciones a nivel de campo.
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "IdProveedor" DataSourceID = "ObjectDataSource1" EnableViewState = "false"> <columnas> <Asp: DataNavigateUrlFields HyperLinkField = "IdProveedor" DataNavigateUrlFormatString = "? ProductsForSupplierDetails.aspx IdProveedor = {0}" Text = "Ver los productos" /> <asp:BoundField DataField="CompanyName" HeaderText="Company" SortExpression="CompanyName" /> <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" /> </ Columns> </ Asp: GridView>

Tome un momento para ver el SupplierListMaster.aspx pgina a travs de un navegador. Como muestra la Figura 7 se muestra, la pgina cuenta actualmente con todos los proveedores, incluyendo un enlace Ver productos. Al hacer clic en el enlace Ver los

productos le llevar a ProductsForSupplierDetails.aspx , pasando por el proveedorIdProveedor en la cadena de consulta.

Figura 7. Cada fila de proveedores contiene un enlace Ver Productos

Paso 3: Listado de los productos del proveedor enProductsForSupplierDetails.aspx


En este punto el SupplierListMaster.aspx pgina est enviando a los usuarios ProductsForSupplierDetails.aspx , pasando por el proveedor seleccionado IdProveedor en la cadena de consulta. ltimo paso del tutorial es mostrar los productos en un GridView en ProductsForSupplierDetails.aspx cuya IdProveedor es igual a la IdProveedor pasa a travs de la cadena de consulta. Para lograr esto empezar por la adicin de un GridView a laProductsForSupplierDetails.aspx pgina, con un nuevo control ObjectDataSource llamadoProductsBySupplierDataSource que invoca el GetProductsBySupplierID ( supplierID ) mtodo de laProductsBLL clase.

Figura 8. Agregar un nuevo ObjectDataSource nombre ProductsBySupplierDataSource

Figura 9. Seleccione la ProductsBLL clase

Figura 10. Tienen el ObjectDataSource Invocar el GetProductsBySupplierID ( supplierID ) Mtodo El ltimo paso del asistente Configurar origen de datos nos pide que proporcione el origen de laGetProductsBySupplierID ( supplierID ) mtodo supplierID parmetro. Para utilizar el valor de cadena de consulta, establecer el origen de los parmetros de cadena de consulta y escriba el nombre del valor de cadena de consulta para su uso en el cuadro de texto QueryStringField ( IdProveedor ).

Figura 11. Llenar el supplierID valor del parmetro de la IdProveedor valor de cadenas de consulta Eso es todo lo que hay que hacer! La figura 12 muestra el ProductsForSupplierDetails.aspx pgina cuando es visitado por clic en el enlace de Tokio comerciantes de SupplierListMaster.aspx .

Figura 12. Los productos suministrados por operadores de Tokio para aparecer

Visualizacin de informacin de proveedores en

ProductsForSupplierDetails.aspx

Como muestra la Figura 12, el ProductsForSupplierDetails.aspx pgina se limita a enumerar los productos que son suministrados por el IdProveedor especificado en la cadena de consulta. Se ha enviado directamente a esta pgina, sin embargo, no saben que la figura 12 se muestran los productos de los comerciantes de Tokio. Para remediar esta situacin nos puede mostrar la informacin del proveedor en esta pgina tambin. Comience por la adicin de un FormView por encima de la GridView productos. Crear un nuevo control ObjectDataSource llamado SuppliersDataSource que invoca el SuppliersBLL clase GetSupplierBySupplierID (supplierID ) mtodo.

Figura 13. Seleccione la SuppliersBLL clase

Figura 14. Tienen el ObjectDataSource Invocar el GetSupplierBySupplierID ( supplierID ) Mtodo Al igual que con el ProductsBySupplierDataSource , tienen la supplierID parmetro asignado el valor de laIdProveedor valor de cadena de consulta.

Figura 15. Llenar el supplierID valor del parmetro de la IdProveedor valor de cadenas de consulta Cuando se une el FormView al ObjectDataSource en la vista Diseo, Visual Studio crea automticamente la FormViewItemTemplate , InsertItemTemplate y EditItemTemplate con controles Label y TextBox Web para cada uno de los campos de datos que devuelve el ObjectDataSource. Ya que slo desea mostrar la informacin del proveedor no dude en eliminar la InsertItemTemplate y EditItemTemplate . A continuacin, editar el ItemTemplate para que muestre el nombre del proveedor de la compaa en un <h3> elemento y la direccin, ciudad, pas y nmero de telfono bajo el nombre de la empresa. Si lo prefiere, puede configurar manualmente el FormView DataSourceID y crear elItemTemplate marcado, como lo hicimos en la Visualizacin de datos con el ObjectDataSource tutorial. Despus de estas ediciones marcado declarativo del FormView debe ser similar a lo siguiente:
<asp:FormView ID="FormView1" runat="server" DataKeyNames="SupplierID" DataSourceID="suppliersDataSource" EnableViewState="False"> <ItemTemplate> <h3> <% # Eval ("CompanyName")%> </ h3> <p> <Asp: Label = ID "DireccinEtiqueta" runat = "server" Text ='<%# Bind ("Direccin") %>'></ asp: Label> <br /> <Asp: Label = ID "CityLabel" runat = "server" Text ='<%# Bind ("Ciudad") %>'></ asp: Label>, <Asp: Label = ID "CountryLabel" runat = "server" Text ='<%# Bind ("Pas") %>'></ asp: Label> <br /> Telfono: <Asp: Label = ID "PhoneLabel" runat = "server" Text ='<%# Bind ("Telfono") %>'></ asp: Label>

</ P> </ ItemTemplate> </ Asp: FormView>

La figura 16 muestra una captura de pantalla de la ProductsForSupplierDetails.aspx pgina despus de que el proveedor de informacin detallada anteriormente se ha incluido.

Figura 16. La lista de productos incluye un resumen sobre los proveedores

Aplicar los toques finales para la usuario

ProductsForSupplierDetails.aspx

interfaz de

Para mejorar la experiencia del usuario de este informe, hay un par de adiciones que debemos hacer a laProductsForSupplierDetails.aspx pgina. Actualmente, la nica manera que un usuario puede pasar de laProductsForSupplierDetails.aspx pgina volver a la lista de proveedores es hacer clic en el botn de su navegador de vuelta. Vamos a agregar un control HyperLink a la ProductsForSupplierDetails.aspx pgina que enlaza conSupplierListMaster.aspx , en otra manera para que el usuario vuelva a la lista maestra.

Figura 17. Agregar un control HyperLink para permitir al usuario volver a SupplierListMaster.aspx Si el usuario hace clic en el enlace Ver los productos a un proveedor que no tiene ningn tipo de productos, laProductsBySupplierDataSource ObjectDataSource en ProductsForSupplierDetails.aspx no devolver ningn resultado. El GridView vinculado a ObjectDataSource no hacer cualquier tipo de cdigo que resulta en una regin en blanco en la pgina en el navegador del usuario. Para comunicarse con mayor claridad para el usuario que no hay productos asociados con el proveedor seleccionado, podemos establecer el GridView EmptyDataText propiedad al mensaje que desee que aparezca cuando surge una situacin as. He creado esta propiedad a "No hay productos que ofrece este proveedor ..." Por defecto, todos los proveedores en la base de datos Neptuno proporcionar al menos un producto. Sin embargo, para este tutorial he modificado manualmente los productos de la tabla para que el proveedor Caracoles Nouveaux ya no est asociado con ningn producto. La figura 18 muestra la pgina de detalles de caracoles Nouveaux despus de este cambio se ha hecho.

Figura 18. El usuario queda informado de que el proveedor no proporciona los productos

Resumen
Mientras maestro / detalle los informes pueden mostrar tanto el maestro y los registros de detalles en una sola pgina, en muchos sitios web que se separan en dos pginas web. En este tutorial nos fijamos en cmo implementar un informe maestro / detalle con los proveedores que figuran en un GridView en la pgina de "maestro" web y los productos asociados que figuran en los "detalles" de la pgina. Cada fila de proveedores en la pgina web master contena un enlace a la pgina de detalles que pasan a lo largo de la fila IdProveedor valor. Especfico de este tipo de fila enlaces se pueden agregar fcilmente usando HyperLinkField el GridView. En la pgina de detalles la obtencin de dichos productos para el proveedor especificado se llev a cabo mediante la invocacin de la ProductsBLL clase GetProductsBySupplierID ( supplierID ) mtodo. El supplierID valor del parmetro se especifica mediante declaracin utilizando la cadena de consulta como el origen de parmetro. Tambin nos fijamos en cmo se muestran los detalles del proveedor en la pgina de detalles con un FormView. Nuestro siguiente tutorial es el ltimo de los informes de maestro / detalle. Vamos a ver cmo mostrar una lista de productos en un GridView donde cada fila tiene un botn de seleccin. Al hacer clic en el botn de seleccin se mostrarn los detalles de ese producto en un control DetailsView en la misma pgina. Programacin feliz!

Tutorial 10: Maestro / detalle utilizando un GridView maestro seleccionable con un DetailView Detalles
Scott Mitchell 06 2006 Descargue el ASPNET_Data_Tutorial_10_CS.exe cdigo de ejemplo.
Descargar el cdigo de ejemplo ASPNET_Data_Tutorial_10_CS.exe.

Contenido del Tutorial 10 (Visual C #) Introduccin Paso 1: Creacin de un GridView seleccionable Paso 2: Mostrar la informacin del producto seleccionado en un DetailsView Resumen

Introduccin
En el tutorial anterior vimos cmo crear un informe maestro / detalle utilizando dos pginas web: un "maestro" de la pgina web, de la que nos muestra la lista de proveedores, y un "detalles" de la pgina web que lista los productos ofrecidos por los seleccionados proveedor. Este formato de dos pginas el informe se pueden resumir en una sola pgina. Este tutorial tiene un GridView cuyas filas incluyen el nombre y el precio de cada producto, junto con un botn de seleccin. Al hacer clic en el botn de seleccin de un determinado producto har que sus detalles se muestran en un control DetailsView en la misma pgina.

Figura 1. Al hacer clic en el botn de seleccin muestra los detalles del Producto

Paso 1: Creacin de un GridView seleccionable


Recordemos que en las dos pginas maestro / detalle el informe que cada registro maestro incluye un hipervnculo que, cuando se hace clic, enva al usuario a la pgina de detalles de pasar la fila pulsada la IdProveedor valor en la cadena de consulta. Un enlace de hipertexto se aadi a cada fila de GridView utilizando un HyperLinkField. Para la pgina de un solo maestro / detalles del informe, que tendr un botn para cada fila de GridView que, cuando se hace clic, muestra los detalles. El control GridView se puede configurar para incluir un botn Seleccionar para cada fila que provoca una devolucin de datos y marca la fila como el GridView SelectedRow . Comience por agregar un control GridView a la DetailsBySelecting.aspx pgina en el filtrado de carpeta, estableciendo su ID de propiedad de ProductsGrid . A continuacin, agregue un nuevo ObjectDataSource llamadoAllProductsDataSource que invoca el ProductsBLL clase GetProducts () mtodo.

Figura 2. Crear un ObjectDataSource nombre AllProductsDataSource

Figura 3. Utilice el ProductsBLL clase

Figura 4. Configurar el ObjectDataSource para invocar la GetProducts () Mtodo Modificar los campos del GridView la eliminacin de todos, pero el ProductName y PrecioUnidad BoundFields. Adems, no dude en modificar estos BoundFields segn sea necesario, como el formato de la PrecioUnidad BoundField como moneda de cambio y la HeaderText propiedades de la BoundFields. Estos pasos pueden llevarse a cabo grficamente, haciendo clic en el enlace Editar columnas de la etiqueta inteligente del control GridView, o por la configuracin manual de la sintaxis declarativa.

Figura 5. Quitar todas las Pero el ProductName y PrecioUnidad BoundFields El margen de beneficio final para el GridView es el siguiente:
<Asp: GridView ID = "ProductsGrid" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "AllProductsDataSource" EnableViewState = "false"> <columnas> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio unitario" HtmlEncode = "false" SortExpression = "UnitPrice" /> </ Columns> </ Asp: GridView>

A continuacin, tenemos que marcar el GridView como seleccionable, lo que aadir un botn Seleccionar para cada fila. Para lograr esto, simplemente marque la casilla de verificacin Habilitar la seleccin en la etiqueta inteligente del GridView.

Figura 6. Hacer filas del GridView seleccionable Marcar la opcin Habilitar Seleccin aade un CommandField a la ProductsGrid GridView con su ShowSelectButtonestablecer la propiedad en True. Esto se traduce en un botn Seleccionar para cada fila de la GridView, como ilustra la Figura 6. De manera predeterminada, los botones de seleccin se representan como LinkButtons, pero puede utilizar los botones o ImageButtons lugar a travs de la CommandField de ButtonType propiedad.
<Asp: GridView ID = "ProductsGrid" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "AllProductsDataSource" EnableViewState = "false"> <columnas> <asp:CommandField ShowSelectButton="True" /> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio unitario" HtmlEncode = "false" SortExpression = "UnitPrice" /> </ Columns> </ Asp: GridView>

Cuando botn Seleccionar de una fila GridView se hace clic en una devolucin de datos y sobreviene el GridViewSelectedRow propiedad se actualiza. Adems de los SelectedRow propiedad, el control GridView proporciona laSelectedIndex , SelectedValue y SelectedDataKey propiedades. El SelectedIndex propieda d devuelve el ndice de la fila seleccionada, mientras que

el SelectedValue y SelectedDataKey propiedades valores de retorno basada en el GridView propiedad DataKeyNames . El DataKeyNames propiedad se utiliza para asociar uno o ms valores de los campos de datos con cada fila y se utiliza comnmente para la identificacin exclusiva de la informacin de atributos de los datos subyacentes en cada fila GridView. El SelectedValue propiedad devuelve el valor de la primera DataKeyNames campo de datos para la fila seleccionada en el SelectedDataKey propiedad devuelve la fila seleccionada de DataKey objeto, que contiene todos los valores de los campos de datos de clave especificados para esa fila. El DataKeyNames propiedad se establece automticamente en el campo de identificacin nica de datos (s) al enlazar un origen de datos a un GridView, DetailsView, FormView o mediante el Diseador. Mientras que esta propiedad se ha establecido para nosotros de forma automtica en los tutoriales anteriores, los ejemplos que han funcionado sin elDataKeyNames propiedad especificada. Sin embargo, para el GridView seleccionable en este tutorial, as como tutoriales para el futuro en el que vamos a examinar la insercin, actualizacin y eliminacin, el DataKeyNames propiedad se debe establecer correctamente. Tmese un momento para asegurarse de que su GridView DataKeyNames propiedad se establece en ProductID . Vamos a ver nuestro progreso hasta el momento a travs de un navegador. Tenga en cuenta que el control GridView muestra el nombre y el precio de todos los productos junto con un LinkButton Select. Al hacer clic en el botn Seleccionar provoca una devolucin de datos. En el paso 2 veremos cmo tener un DetailsView responder a esta devolucin, mostrando los detalles del producto seleccionado.

Figura 7. Cada producto contiene una fila Seleccione LinkButton

Destacando la fila seleccionada

El ProductsGrid GridView tiene una SelectedRowStyle propiedad que se puede utilizar para dictar el estilo visual de la fila seleccionada. Se utiliza correctamente, esto puede mejorar la experiencia del usuario de forma ms clara que muestra la fila de GridView est seleccionado actualmente. Para este tutorial, vamos a tener la fila seleccionada se resaltar con un fondo amarillo. Al igual que con nuestros tutoriales anteriores, vamos a tratar de mantener los valores estticos relacionados define como las clases CSS. Por lo tanto, crear una nueva clase CSS en styles.css llamado SelectedRowStyle .
. SelectedRowStyle { background-color: Amarillo; }

Para aplicar esta clase CSS a la SelectedRowStyle propiedad de todos los GridViews en nuestra serie de tutoriales, editar el GridView.skin la piel en el DataWebControls Temtico para incluir a la SelectedRowStyle configuracin como se muestra a continuacin:
<asp:GridView runat="server" CssClass="DataWebControlStyle"> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <RowStyle CssClass="RowStyle" /> <HeaderStyle CssClass="HeaderStyle" /> <SelectedRowStyle CssClass="SelectedRowStyle" /> </ Asp: GridView>

Con esta adicin, la fila de GridView seleccionado se resalta con un color de fondo amarillo.

Figura 8. Personalizar la apariencia de la fila seleccionada de GridView Con el SelectedRowStyle Propiedad

Paso 2: Mostrar la informacin del producto seleccionado en un DetailsView


Con la ProductsGrid GridView completo, todo lo que queda es aadir un DetailsView que muestra informacin sobre el producto que se seleccione. Agregue un control DetailsView por encima de la GridView y ObjectDataSource crea una nueva llamada ProductDetailsDataSource . Como queremos que esta DetailsView para mostrar la informacin en particular sobre el producto seleccionado, configurar el ProductDetailsDataSource utilizar el ProductsBLL claseGetProductByProductID ( productID ) mtodo.

Figura 9. Invocar la ProductsBLL Clase GetProductByProductID ( productID ) Mtodo Tienen la productID valor del parmetro, obtenidos a partir del control GridView SelectedValue propiedad. Como hemos comentado anteriormente, el GridView SelectedValue propiedad devuelve el primer valor de datos clave para la fila seleccionada. Por lo tanto, es imperativo que el GridView DataKeyNames propiedad se establece en ProductID , de modo que la fila seleccionada de ProductID valor es devuelto por SelectedValue .

Figura 10. Establecer el productID parmetros a la GridView SelectedValue Propiedad Una vez que el productDetailsDataSource ObjectDataSource se ha configurado correctamente y con destino a la DetailsView, este tutorial es completo! Cuando la pgina se visit por primera vez se ha seleccionado ninguna fila, por lo que el GridView SelectedValue propiedad devuelve null . Dado que no existen productos con un NULL ProductIDvalor, no hay registros devueltos por la GetProductByProductID ( productID ) mtodo, lo que significa que el DetailsView no se muestra (ver Figura 11). Al hacer clic en el botn Seleccionar de una fila GridView, sobreviene una devolucin de datos y el DetailsView actualice. Esta vez, el GridView SelectedValue propiedad devuelve el ProductIDde la fila seleccionada, el GetProductByProductID ( productID ) mtodo devuelve un ProductsDataTable con informacin acerca de ese producto en particular, y el DetailsView muestra los detalles (ver figura 12).

Figura 11. Cuando visit por primera vez, slo el GridView se muestra

Figura 12. Al seleccionar una fila, Detalles del Producto es mostrado

Resumen
En este y en los tutoriales anteriores tres que hemos visto una serie de tcnicas para la visualizacin de maestro / detalle los informes. En este tutorial vamos a examinar con un GridView seleccionable a la casa de los registros maestros y un DetailsView para ver detalles sobre el registro maestro de seleccionados en la misma pgina. En los tutoriales anteriores vimos cmo mostrar maestro / detalles reportes usando DropDownLists y la visualizacin de los registros maestros en una pgina Web y los registros de detalles en otra. En este tutorial se concluye el examen de los informes de maestro / detalle. Comenzando con el siguiente tutorial vamos a comenzar nuestra exploracin del formato personalizado con el GridView, DetailsView y FormView. Vamos a ver cmo personalizar el aspecto de estos controles basados en los datos enlazados a ellos, cmo resumir los datos de pie de pgina del control GridView, y cmo utilizar las plantillas para obtener un mayor grado de control sobre el diseo. Programacin feliz!

Tutorial 11: Formato personalizado basado en los datos


Scott Mitchell 02 2007 Descargar el cdigo de la muestra . Contenido del Tutorial 11 (Visual C #) Introduccin Paso 1: Visualizacin de la informacin del producto en un DetailsView Paso 2: programacin Determinacin del valor de los datos en el controlador de eventos DataBound Paso 3: Dar formato al valor UnitPrice en la DetailsView Paso 4: Visualizacin de la informacin del producto en un FormView Paso 5: programacin La determinacin del valor de los datos en el controlador de eventos DataBound Paso 6: Dar formato al control de etiquetas UnitsInStockLabel en el FormView ItemTemplate Paso 7: Visualizacin de informacin del producto en un GridView Paso 8: determinar mediante programacin el valor de los datos en el controlador de eventos RowDataBound Paso 9: destacando el amarillo Fila Cuando el valor UnitPrice es menos de $ 10 Conclusin Sobre el autor Agradecimientos

Introduccin
La aparicin de la GridView , DetailsView y FormView controles se pueden personalizar a travs de miles de propiedades relacionadas con el estilo. Propiedades como CssClass , fuente , BorderWidth , BorderStyle ,BorderColor , ancho y altura , entre otros, determinan la apariencia general del control prestados. Propiedades, incluyendo HeaderStyle , RowStyle , AlternatingRowStyle , y otros permiten la configuracin mismo estilo que se aplicarn a las secciones en particular. Del mismo modo, estos ajustes de estilo se pueden aplicar sobre el terreno. En muchos escenarios, sin embargo, los requisitos de formato depender del valor de los datos mostrados. Por ejemplo, para llamar la atencin sobre agotadas, un informe acerca de los productos de informacin podra poner el color de fondo amarillo para aquellos productos cuyo UnitsInStock y UnitsOnOrder campos son iguales a 0. Para resaltar los productos ms caros, es posible que desee mostrar los precios de los productos que cuestan ms de $ 75 en negrita. Ajuste el formato del GridView , DetailsView o FormView basado en los datos enlazados a que se puede lograr de varias maneras. En este tutorial, vamos a ver cmo llevar a cabo

el formato de los datos enlazados a travs del uso de la DataBound y RowDataBound controladores de eventos. En el siguiente tutorial vamos a explorar un enfoque alternativo.

Utilizando controlador de eventos DataBound el control DetailsView de


Cuando los datos se enlaza a un DetailsView , ya sea de un control de origen de datos mediante programacin oa travs de la asignacin de datos para el control de origen de datos de propiedad y llamando a su DataBind () , la secuencia de pasos ocurren:
1. El control de datos Web DataBinding activa el evento.

2. Los datos se enlaza al control de datos de Web. 3. El control de datos Web DataBound activa el evento. Lgica personalizada puede ser inyectada inmediatamente despus de los pasos 1 y 3 a travs de un controlador de eventos. Mediante la creacin de un controlador de eventos para el DataBound caso de que se puede determinar mediante programacin los datos que se ha enlazado al control web de datos y ajustar el formato, segn sea necesario.Para ilustrar esto vamos a crear un DetailsView que mostrar informacin general acerca de un producto, sino que mostrar el Precio por unidad de valor en un tipo de letra negrita, cursiva si es superior a $ 75.

Paso 1: Visualizacin de la informacin del producto en un DetailsView


Abra la pgina CustomColors.aspx en la carpeta CustomFormatting, arrastre un DetailsView de control desde el Cuadro de herramientas hasta el Diseador, establezca su identificacin valor de la propiedadExpensiveProductsPriceInBoldItalic , y asociarla a un nuevo ObjectDataSource control que invoca el ProductsBLLclase GetProducts () mtodo. Los pasos detallados para lograr esto se omiten aqu por brevedad ya que los examin en detalle en tutoriales anteriores. Despus de haber atado el ObjectDataSource al DetailsView , tome un momento para modificar la lista de campos. He optado por quitar el BoundField llama s ProductID , IdProveedor , CategoryID , UnitsInStock , UnitsOnOrder ,ReorderLeve l y descatalogados , y cambi el nombre y formatear el resto BoundField s. Tambin limpi el ancho y la altura de configuracin. Debido a que el DetailsView muestra un solo registro, hay que habilitar la paginacin con el fin de permitir al usuario final para ver todos los productos. Hacerlo mediante la comprobacin de la paginacin Activarcasilla de verificacin en el DetailsView tag 's inteligente.

Figura 1. Marque la casilla de verificacin Habilitar paginacin en la etiqueta inteligente del DetailsView es. (Clic en la foto para una imagen ms grande.) Despus de estos cambios, el DetailsView marcado ser el siguiente:
<Asp: DetailsView ID = "DetailsView1" runat = "server" AllowPaging = "True" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" EnableViewState = "false"> <Fields> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "Cantidad / Unidad" SortExpression = "CantidadPorUnidad" /> <Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio" HtmlEncode = "false" SortExpression = "UnitPrice" /> </ Campos> </ Asp: DetailsView>

Tome un momento para poner a prueba esta pgina en su navegador.

Figura 2. El control DetailsView muestra un producto a la vez. (Clic en la foto para una imagen ms grande.)

Paso 2: programacin Determinacin del valor de los datos en el controlador de eventos DataBound
Con el fin de mostrar el precio en negrita, cursiva para aquellos productos cuyo PrecioUnidad valor supera los $ 75, primero tenemos que ser capaces de determinar mediante programacin el PrecioUnidad valor. Para el DetailsView , esto se puede lograr en el DataBound controlador de eventos. Para crear el controlador de eventos, haga clic en elDetailsView en el diseador vaya a la ventana Propiedades. Presione F4 para que aparezca, si no es visible, o vaya a laVista y seleccione la ventana Propiedades del men. En la ventana Propiedades, haga clic en el icono de rayo a la lista de los DetailsView eventos 's. A continuacin, haga doble clic en el DataBound evento o escriba el nombre del controlador de eventos que desea crear. Figura 3. Crear un controlador de eventos para el evento de enlace de datos. Si lo hace, crear automticamente el controlador de eventos y le llevar a la parte de cdigo en el que se ha aadido.En este punto, ver lo siguiente:
protected void ExpensiveProductsPriceInBoldItalic_DataBound (object sender, E EventArgs) {

Los datos enlazados a la DetailsView se puede acceder a travs de la DataItem propiedad. Recordemos que son vinculantes para los controles a un establecimiento inflexible de tipos DataTable , que se compone de una coleccin con establecimiento inflexible de DataRow casos. Cuando el DataTable se une a la DetailsView , el primer DataRow en elDataTable est asignada a la DetailsView 's DataItem propiedad. En concreto, el DataItem propiedad se le asigna unDataRowView objeto. Podemos utilizar la fila de propiedad de DataRowView para acceder a la base DataRow objeto, que es en realidad un ProductsRow ejemplo. Cuando tenemos esta ProductsRow ejemplo, podemos tomar una decisin con slo inspeccionar los valores de la propiedad del objeto. El siguiente cdigo muestra cmo determinar si el Precio por unidad de valor vinculado a la DetailsView control es mayor de $ 75:
protected void ExpensiveProductsPriceInBoldItalic_DataBound (object sender, E EventArgs) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) . ExpensiveProductsPriceInBoldItalic.DataItem) la fila; if (! product.IsUnitPriceNull () & & product.UnitPrice> 75m) { / / TODO: Hacer que el texto PrecioUnidad en negrita y cursiva } }

Tenga en cuenta Debido a PrecioUnidad puede tener un nulo valor en la base de datos, primero asegrese de que no estamos tratando con un NULL el valor antes de acceder al ProductsRow 'sPrecioUnidad propiedad. Esta verificacin es importante, porque si intentamos acceder a la PrecioUnidadpropiedad cuando tiene un NULL el valor, la ProductsRow objeto lanzar una excepcin StrongTypingException .

Paso 3: Dar formato al valor UnitPrice en la DetailsView


En este punto, podemos determinar si el Precio por unidad de valor vinculado a la DetailsView tiene un valor que supera los $ 75, pero todava tenemos que ver cmo ajustar la programacin DetailsView formato 's en consecuencia.Para modificar el formato de una fila completa en el DetailsView , acceso mediante programacin a la fila conDetailsViewID.Rows [i] , para modificar una celda en particular, el acceso uso DetailsViewID.Rows [i] Las clulas [indice]. . Despus tenemos una referencia a la fila o celda, podemos ajustar su apariencia mediante el establecimiento de un estilo relacionado con las propiedades. Acceso a una fila de programacin requiere que se conozca el ndice de fila, que comienza en 0. El Precio por unidadde fila es la quinta fila en el DetailsView , dndole un ndice

de 4, y por lo que es accesible a travs de programacinExpensiveProductsPriceInBoldItalic.Rows [4] . En este punto, podramos tener el contenido de la fila entera se muestra en negrita, cursiva utilizando el siguiente cdigo:
ExpensiveProductsPriceInBoldItalic.Rows [4] Font.Bold = true.; ExpensiveProductsPriceInBoldItalic.Rows [4] Font.Italic = true.;

Sin embargo, esto har que tanto la etiqueta (precio) y el valor en negrita y cursiva. Si queremos hacer slo el valor en negrita y cursiva se debe aplicar este formato a la segunda celda de la fila, que se puede lograr mediante:
ExpensiveProductsPriceInBoldItalic.Rows [4] Las clulas [1] = true Font.Bold..; ExpensiveProductsPriceInBoldItalic.Rows [4] Las clulas [1] = true Font.Italic..;

Debido a que nuestros tutoriales hasta ahora han utilizado las hojas de estilo para mantener una clara separacin entre el marcado que se representa e informacin relacionadas con el estilo, en lugar de establecer las propiedades de estilo tal como se indica anteriormente, vamos a utilizar en su lugar una clase CSS. Abra la hoja de estilo styles.css y aadir una nueva clase de CSS llamado ExpensivePriceEmphasis con la siguiente definicin:
. ExpensivePriceEmphasis { font-weight: bold; font-style: italic; }

Luego, en la DataBound controlador de eventos, establezca la clula CssClass propiedad ExpensivePriceEmphasis . El siguiente cdigo muestra la DataBound controlador de eventos en su totalidad:
protected void ExpensiveProductsPriceInBoldItalic_DataBound (object sender, E EventArgs) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) . ExpensiveProductsPriceInBoldItalic.DataItem) la fila; if (! product.IsUnitPriceNull () & & product.UnitPrice> 75m) { ExpensiveProductsPriceInBoldItalic.Rows [4]. Clulas [1]. CssClass = "ExpensivePriceEmphasis"; }

Al visualizar Chai, que cuesta menos de $ 75, el precio se muestra en una fuente normal (ver Figura 4). Sin embargo, al ver Mishi Kobe Niku, que tiene un precio de 97 dlares, el precio se muestra en negrita, cursiva (ver Figura 5).

Figura 4. Precios por debajo de $ 75 se muestran en una fuente normal. (Clic en la foto para una imagen ms grande.)

Figura 5. Los precios de los productos caros "se muestran en negrita, en cursiva. (Clic en la foto para una imagen ms grande.)

Utilizando controlador de eventos DataBound el control FormView


Los pasos para determinar los datos de base unido a un FormView son idnticas a las de un DetailsView : Crear unDataBound controlador de eventos, el elenco DataItem propiedad para el tipo de objeto apropiado enlazado al control, y determinar cmo proceder. El FormView y DetailsView difieren, sin embargo, en la forma en la apariencia de su interfaz de usuario se actualiza. El FormView no contiene ningn BoundField s y por lo tanto carece de la filas de coleccin. En cambio, un FormViewse compone de las plantillas, que puede contener una mezcla de HTML esttico, controles Web, y la sintaxis de enlace de datos. Ajuste del estilo de un FormView normalmente implica el ajuste al estilo de uno o varios de los controles Web en el FormView plantillas 's. Para ilustrar esto, vamos a usar un FormView a la lista de productos como en el ejemplo anterior, pero esta vez vamos a mostrar slo el nombre del producto y las unidades en stock con las unidades en stock muestran en una fuente de color rojo si es menor o igual a 10.

Paso 4: Visualizacin de la informacin del producto en un FormView


Aadir un FormView a la pgina de CustomColors.aspx debajo de la DetailsView , y establecer su identificacin de propiedad de LowStockedProductsInRed . Obligar a la FormView al ObjectDataSource de control creado en el paso anterior. Esto crear un ItemTemplate , EditItemTemplate y InsertItemTemplate para el FormView . Retire elEditItemTemplate y InsertItemTemplate , y simplificar el ItemTemplate para incluir slo los ProductName yUnitsInStock valores, cada uno en su propio nombre apropiado de etiquetas de control. Al igual que el DetailsViewen el ejemplo anterior, tambin la paginacin Activar casilla de verificacin en el FormView tag 's inteligente. Despus de estas ediciones de su FormView marcado 's debe ser similar a lo siguiente:
<Asp: FormView ID = "LowStockedProductsInRed" runat = "server" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True" EnableViewState = "false"> <ItemTemplate> <b> del producto: </ b> <Asp: Label = ID "ProductNameLabel" runat = "server" Texto ='<%# Bind ("ProductName")%> '> </ Asp: Label> <br /> Unidades <b> En Stock: </ b> <Asp: Label = ID "UnitsInStockLabel" runat = "server" Texto ='<%# Bind ("UnitsInStock")%> '>

</ Asp: Label> </ ItemTemplate> </ Asp: FormView>

Tenga en cuenta que el ItemTemplate contiene:


HTML esttico -El texto "Producto" y "Unidades en Stock:" junto con el <br /> y <b> elementos Los controles Web -Las dos etiquetas controles, ProductNameLabel y UnitsInStockLabel De enlace de datos de sintaxis -El <% # Bind ("ProductName")%> y <% # Bind ("UnitsInStock")%> sintaxis, que asigna los valores de estos campos para el texto las propiedades de la Etiqueta de los controles

Paso 5: Determinacin de la programacin valor de los datos en el controlador de eventos DataBound


Con el FormView 's marcado completa, el siguiente paso es determinar mediante programacin si el UnitsInStock valor es menor o igual a 10. Esto se logra de la manera exactamente el mismo con el FormView como lo fue con elDetailsView . Comience por crear un controlador de eventos para el FormView 's DataBound evento. Figura 6. Crear el controlador de eventos DataBound. En el evento, el elenco DataItem propiedad del FormView a un ProductsRow ejemplo, y determinar si el UnitsInPricevalor es tal que tenemos que mostrar en una fuente roja.
protected void LowStockedProductsInRed_DataBound (object sender, EventArgs e) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) . LowStockedProductsInRed.DataItem) la fila; if (! product.IsUnitsInStockNull () & & product.UnitsInStock <= 10) { / / TODO: Hacer que el texto UnitsInStockLabel rojo } }

Paso 6: Dar formato al control de etiquetas UnitsInStockLabel en ItemTemplate del FormView


El ltimo paso es dar formato a la muestra UnitsInStock valor en una fuente de color rojo si el valor es de 10 o menos.Para lograr esto, se debe acceder a la

programacin UnitsInStockLabel de control en el ItemTemplate y establezca sus propiedades de estilo para que su texto se muestra en rojo. Para acceder a un control de Web en una plantilla, utilice el FindControl ("controlID") mtodo, como se muestra aqu:
WebControlType someName = (WebControlType) FormViewID.FindControl ("controlID");

Para nuestro ejemplo, queremos acceder a una etiqueta de control, cuyo ID es el valor UnitsInStockLabel , por lo que tendra que utilizar los siguientes:
Etiqueta UnitsInStock = (Label) LowStockedProductsInRed.FindControl ("UnitsInStockLabel");

Despus tenemos una referencia programtica en el control Web, podemos modificar su estilo de propiedades relacionadas, segn sea necesario. Al igual que con el ejemplo anterior, he creado una clase CSS en styles.css llamadoLowUnitsInStockEmphasis . Para aplicar este estilo a la etiqueta de control Web, establezca su CssClass propiedad en consecuencia.
protected void LowStockedProductsInRed_DataBound (object sender, EventArgs e) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) . LowStockedProductsInRed.DataItem) la fila; if (! product.IsUnitsInStockNull () & & product.UnitsInStock <= 10) { Etiqueta UnitsInStock = (Label) LowStockedProductsInRed.FindControl ("UnitsInStockLabel");

if (UnitsInStock! = null) { unitsInStock.CssClass = "LowUnitsInStockEmphasis"; } } }

Nota La sintaxis de formato de una plantilla de programacin, acceder a la Web usando el controlFindControl ("controlID") , y luego poner su estilo de propiedades relacionadas, tambin puede utilizarse cuando se utiliza TemplateFields en el DetailsView o GridView controles. Vamos a examinarTemplateField s en nuestro prximo tutorial. La figura 7 muestra el FormView cuando se ve un producto cuya UnitsInStock valor es superior a 10, mientras que el producto en la figura 8 tiene un valor inferior a 10.

Figura 7. Para los productos con un UnitsInStock suficientemente grande, no se aplica un formato personalizado.(Clic en la foto para una imagen ms grande.)

Figura 8. El nmero UnitsInStock se muestra en rojo para aquellos productos con valores de 10 o menos. (Clic en la foto para una imagen ms grande.)

Con formato de evento RowDataBound el GridView


Anteriormente, se analiz la secuencia de pasos que el DetailsView y FormView el progreso a travs de los controles durante el enlace de datos. Vamos a ver ms de estos pasos una vez ms, como un recordatorio.
1. El control de datos Web DataBinding activa el evento.

2. Los datos se enlaza al control de datos de Web. 3. El control de datos Web DataBound activa el evento. Estos tres pasos son suficientes para el DetailsView y FormView , ya que muestran slo un nico registro. Para elGridView , que muestra todos los registros vinculados a ella (no slo el primero), el paso 2 es un poco ms complicado.

En el paso 2, el GridView enumera la fuente de datos y, para cada registro, crea un GridViewRow instancia y se une el registro actual a la misma. Para cada GridViewRow aadido a la GridView , dos eventos se producen:

RowCreated -incendios despus de la GridViewRow se ha creado RowDataBound el fuego despus de que el registro actual se ha unido a la GridViewRow

Para el GridView y, a continuacin, enlace de datos se describe con mayor precisin por la siguiente secuencia de pasos:
1. El DataBinding caso de que el GridView incendios. 2. Los datos se enlaza a la GridView .

Para cada registro del origen de datos: Crear un GridViewRow objeto. El fuego RowCreated evento. Vincular el registro a la GridViewRow . El fuego RowDataBound evento. Agregue el GridViewRow a la filas de coleccin. 3. El GridView 's DataBound activa el evento.
a. b. c. d. e.

Para personalizar el formato de la GridView registros 's individuales, entonces, tenemos que crear un controlador de eventos para el RowDataBound evento. Para ilustrar esto, vamos a agregar un GridView a la pgina de CustomColors.aspx que muestra el nombre, categora y precio de cada producto, destacando aquellos productos cuyo precio es inferior a $ 10, con un color de fondo amarillo.

Paso 7: Visualizacin de informacin del producto en un GridView


Aadir un GridView por debajo de la FormView del ejemplo anterior y establecer su identificacin de propiedad deHighlightCheapProducts . Porque ya tenemos un ObjectDataSource que devuelve todos los productos en la pgina, enlazar el GridView a eso. Finalmente, edite el BoundField s del GridView para incluir slo los nombres de los productos, categoras y precios. Despus de estas modificaciones, el GridView marcado 's deben tener el siguiente aspecto:
<Asp: GridView ID = "HighlightCheapProducts" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" EnableViewState = "false"> <columnas> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" />

<Asp: BoundField DataField = "UnitPrice" DataFormatString = "{0: c}" HeaderText = "Precio" HtmlEncode = "false" SortExpression = "UnitPrice" /> </ Columns> </ Asp: GridView>

La Figura 9 muestra nuestro progreso a este punto, cuando se ve a travs de un navegador.

Figura 9. El GridView muestra el nombre, categora, y el precio de cada producto. (Clic en la foto para una imagen ms grande.)

Paso 8: programacin Determinacin del valor de los datos en el controlador de eventos RowDataBound
Cuando el ProductsDataTable se une a la GridView , su ProductsRow casos se enumeran y, para cada ProductsRow , un GridViewRow se crea. El DataItem propiedad de la GridViewRow se le asigna a lo particular ProductRow , despus de que el RowDataBound controlador de eventos del GridView se eleva. Para determinar el Precio por unidad de valor para cada producto vinculado a la GridView y, a continuacin, debemos crear un controlador de eventos para elRowDataBound caso de que el GridView . En este controlador de eventos, podemos inspeccionar el PrecioUnidadvalor de la corriente GridViewRow y tomar una decisin el formato de la fila.

Este controlador de eventos se pueden crear mediante el uso de la misma serie de pasos con el FormView yDetailsView . Figura 10. Cree un controlador de eventos para el evento RowDataBound el GridView. Crear el controlador de eventos de esta forma har que el siguiente cdigo que se aade automticamente a la parte de cdigo de la pgina ASP.NET:
protected void HighlightCheapProducts_RowDataBound (object sender, GridViewRowEventArgs e) {

Cuando el RowDataBound activa el evento, el controlador de eventos se pasa como segundo parmetro, un objeto de tipo GridViewRowEventArgs , que tiene una propiedad denominada fila . Esta propiedad devuelve una referencia a laGridViewRow que estaba enlazado a datos. Para acceder a la ProductsRow instancia enlazada a la GridViewRow , se utiliza el DataItem propiedad, como se muestra aqu:
protected void HighlightCheapProducts_RowDataBound (object sender, GridViewRowEventArgs e) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) e.Row.DataItem) Fila.; if (! product.IsUnitPriceNull () & & product.UnitPrice <10m) { / / TODO: Resalte la fila amarilla ... } }

Cuando trabajamos con la RowDataBound controlador de eventos, es importante tener en cuenta que el GridView se compone de diferentes tipos de filas y que este evento se dispara para todos los tipos de fila. El tipo de unaGridViewRow se puede determinar por su rowType propiedad, y puede tener uno de los posibles valores:

DataRow -Una fila que est enlazado a un registro del origen de datos del GridView EmptyDataRow -La fila se muestra si el GridView 's DataSource est vaca Pie de pgina , la fila de pie, muestra si el ShowFooter propiedad del GridView se ajusta a la verdad Cabecera -El ttulo de la fila, se muestra si la ShowHeader propiedad del GridView est establecido enverdadero (por defecto)

Localizador -Para un GridView que implementa la paginacin, la fila que muestra la interfaz de paginacin Separador no utilizados para el GridView , pero utilizado por el rowType propiedades para el DataList y elrepetidor de los controles (dos controles web de datos que vamos a discutir en futuros tutoriales)

Debido a que el EmptyDataRow , encabezado , pie de pgina , y Pager filas no estn asociados con un origen de datos de registro, que siempre tendr un nulo valor para sus DataItem propiedad. Por esta razn, antes de intentar trabajar con el DataItem propiedad de la actual GridViewRow , primero tenemos que asegurarnos de que estamos tratando con un DataRow . Esto se puede lograr mediante el control de la rowType propiedad de la GridViewRow , de la siguiente manera:
protected void HighlightCheapProducts_RowDataBound (object sender, GridViewRowEventArgs e) { / / Asegrese de que estamos trabajando con una fila de datos si (== e.Row.RowType DataControlRowType.DataRow) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) e.Row.DataItem) Fila.; if (! product.IsUnitPriceNull () & & product.UnitPrice <10m) { / / TODO: fila resaltado en amarillo ... } } }

Paso 9: Al destacar la amarilla fila cuando el valor UnitPrice es menos de $ 10


El ltimo paso es poner de relieve toda la programacin GridViewRow si el Precio por unidad de valor para ese registro es menos de $ 10. La sintaxis para acceder a un GridView filas 's o de las clulas es el mismo que con elDetailsView : GridViewID.Rows [i] para acceder a toda la fila, y GridViewID.Rows [i] Las clulas [indice]. para acceder a una celda en particular. Sin embargo, cuando el RowDataBound incendios de controlador de eventos, el enlace de datosGridViewRow an no se ha aadido a la filas de la coleccin de GridView . Por lo tanto, no se puede acceder a la actual GridViewRow ejemplo de la RowDataBound controlador de eventos utilizando el Filas coleccin.

En lugar de GridViewID.Rows [i] , se puede hacer referencia a la actual GridViewRow ejemplo, en el RowDataBoundcontrolador de eventos utilizando e.Row . Es decir, con el fin de poner de relieve la actual GridViewRow ejemplo de laRowDataBound controlador de eventos, podemos utilizar los siguientes:
e.Row.BackColor = System.Drawing.Color.Yellow;

En lugar de establecer la propiedad BackColor de la propiedad GridViewRow directamente, vamos a seguir con el uso de clases CSS. He creado una clase CSS llamada AffordablePriceEmphasis que establece el color de fondo amarillo. El completado RowDataBound controlador de eventos siguiente:
protected void HighlightCheapProducts_RowDataBound (object sender, GridViewRowEventArgs e) { / / Asegrese de que estamos trabajando con una fila de datos si (== e.Row.RowType DataControlRowType.DataRow) { / / Obtener el objeto ProductsRow de la propiedad DataItem ... Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) e.Row.DataItem) Fila.; if (! product.IsUnitPriceNull () & & product.UnitPrice <10m) { e.Row.CssClass = "AffordablePriceEmphasis"; } } }

Figura 11. Los productos ms asequibles estn resaltadas en amarillo. (Clic en la foto para una imagen ms grande.)

Conclusin
En este tutorial, hemos visto cmo dar formato al GridView , DetailsView y FormView basado en los datos enlazados al control. Para llevar a cabo, esto que hemos creado un controlador de eventos para el DataBound o RowDataBoundevento, donde los datos subyacentes se examin junto con un cambio de formato, si es necesario. Para acceder a los datos enlazados a un DetailsView o FormView , se utiliza el DataItem propiedad en el DataBound controlador de eventos, para un GridView , el DataItem propiedad de cada GridViewRow instancia contiene los datos enlazados a la fila, que est disponible en el RowDataBound controlador de eventos. La sintaxis de programacin ajustar el formato en el control Web de datos depende del control de Internet y cmo los datos para ser formateado se muestra. Para DetailsView y GridView controles, las filas y las clulas se puede acceder mediante un ndice ordinal. Para el FormView , que utiliza las plantillas, el FindControl ("controlID") se utiliza normalmente para localizar a un control de Web desde dentro de la plantilla.

En el siguiente tutorial, veremos cmo utilizar las plantillas con el GridView y DetailsView . Adems, vamos a ver otra tcnica para personalizar el formato basado en los datos subyacentes.

Tutorial 12: Uso de TemplateFields en el control GridView


Scott Mitchell 02 2007 Descargar el cdigo de la muestra . Contenido del Tutorial 12 (Visual C #) Introduccin Paso 1: unin de los datos para el GridView Paso 2: Visualizacin de los nombres y apellidos en una sola columna Paso 3: Con el control Calendar para mostrar el campo HireDate Paso 4: Muestra el nmero de das que el empleado haya trabajado para la empresa Conclusin Sobre el autor Agradecimientos

Introduccin
El GridView se compone de un conjunto de campos que indican lo que las propiedades del origen de datos se incluirn en el resultado representado junto con la forma de los datos en la pantalla. El tipo ms simple es el campoBoundField , que muestra un valor de datos como texto. Otros tipos de campo de visualizacin de los datos usando elementos HTML alternativo. El CheckBoxField , por ejemplo, se muestra como una casilla de verificacin que comprueba el estado depende del valor de un campo de datos especificado, el ImageField trasmite una imagen cuya imagen de origen se basa en un campo de datos especificado. Los hipervnculos y los botones de cuyo estado depende de una base de datos de campo valor puede representarse mediante la HyperLinkField y ButtonField tipos de campo, respectivamente. Mientras que el CheckBoxField , ImageField , HyperLinkField y ButtonField tipos de campo para permitir una vista alternativa de los datos, todava son bastante limitados con respecto al formato. A CheckBoxField slo puede mostrar una casilla de verificacin, mientras que un ImageField slo puede mostrar una sola imagen. Qu pasa si un campo en particular debe mostrar un texto, una casilla de verificacin, y una imagen, todo se basa

en diferentes campos de datos los valores? O qu pasa si queremos mostrar los datos utilizando un control Web que no sea el CheckBox , de imagen, HyperLink , o el botn ? Adems, el BoundField limita su pantalla a un nico campo de datos. Qu pasa si hemos querido mostrar dos o ms campos de datos los valores en un solo GridView columna? Para adaptarse a este nivel de flexibilidad, el GridView ofrece la TemplateField , que hace uso de una plantilla . Una plantilla puede incluir una combinacin de HTML esttico, controles Web, y la sintaxis de enlace de datos. Adems, elTemplateField tiene una variedad de plantillas que se pueden utilizar para personalizar la representacin de las diferentes situaciones. Por ejemplo, el ItemTemplate se utiliza por defecto para hacer que el celular para cada fila, pero el EditItemTemplate plantilla se puede utilizar para personalizar la interfaz para editar los datos. En este tutorial, vamos a examinar cmo utilizar el TemplateField para lograr un mayor grado de personalizacin con el GridView control. En el tutorial anterior , vimos cmo personalizar el formato basado en los datos subyacentes utilizando el DataBound y RowDataBound controladores de eventos. Otra manera de personalizar el formato basado en los datos subyacentes llamando a los mtodos de formato dentro de una plantilla. Pronto nos ocuparemos de esta tcnica en este tutorial, tambin. Para este tutorial, vamos a utilizar TemplateField s para personalizar el aspecto de una lista de empleados. En concreto, vamos a una lista de todos los empleados, pero se mostrarn los nombres y apellidos de los empleados en una columna, sus fechas de contratacin en un calendario de control, y una columna de estado que indica cuntos das han sido empleados en la empresa.

Figura 1. Tres TemplateFields se utilizan para personalizar la pantalla. (Clic en la foto para una imagen ms grande.)

Paso 1: unin de los datos para el GridView


En escenarios de informes en los que se debe utilizar TemplateField s para personalizar el aspecto, me resulta ms fcil empezar por la creacin de un GridView control que contiene slo BoundField s primero, y luego aadir nuevasTemplateField s o convertir la actual BoundField s para TemplateField s, como sea necesario. Por lo tanto, vamos a

empezar este tutorial mediante la adicin de un GridView a la pgina a travs del diseo y enlazarlo a unObjectDataSource que devuelve la lista de empleados. Estas medidas contribuirn a crear un GridView con unBoundField para cada uno de los campos de los empleados. Abra la pgina GridViewTemplateField.aspx y arrastre un GridView del cuadro de herramientas hasta el diseador.Desde el GridView tag 's inteligente, optar por aadir un nuevo ObjectDataSource control que invoca el GetEmployees () el mtodo de la EmployeesBLL clase.

Figura 2. Aadir un nuevo control ObjectDataSource que invoca el mtodo GetEmployees (). (Clic en la foto para una imagen ms grande.) Enlazar el GridView de esta manera se aade automticamente una BoundField para cada una de las propiedades de los empleados: de empleado , Apellido , Nombre , Ttulo , Fecha de contratacin , ReportsTo , y Pas . Para este informe, no hay que preocuparse por mostrar el EmployeeID , ReportsTo , o Pas de propiedad. Para eliminar estosBoundField s, usted puede:

Utilice el Campos cuadro de dilogo. Haga clic en el Editar columnas enlace desde el GridView tag 's inteligente para abrir este cuadro de dilogo. A continuacin, seleccione la BoundFields de la lista inferior izquierda, y haga clic en el rojo X botn para eliminar el BoundField . Edite el GridView sintaxis 's declarativa con la mano. Desde el punto de vista de origen, eliminar la<asp:BoundField> elemento para la BoundField que desea eliminar.

Despus de haber quitado la BoundFields nombre de empleado , ReportsTo y Pas , el GridView 's marcado debe tener el siguiente aspecto:
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "EmployeeID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: BoundField DataField = "Apellido" HeaderText = "Apellido" SortExpression = "Apellido" /> <Asp: BoundField DataField = "Nombre" HeaderText = "Nombre"

SortExpression = "Nombre" /> <Asp: BoundField DataField = "Ttulo" HeaderText = "Ttulo" SortExpression = "Ttulo" /> <Asp: BoundField DataField = "HireDate" HeaderText = "Fecha de contratacin" SortExpression = "Fecha de contratacin" /> </ Columns> </ Asp: GridView>

Tome un momento para ver nuestro progreso en un navegador. En este punto, usted debe ver una tabla con un registro de cada empleado y cuatro columnas: una por el apellido del empleado, nombre, ttulo y fecha de contratacin.

Figura 3. El Apellido, Nombre, Ttulo, Fecha de contratacin y los campos se muestran para cada empleado. (Clic en la foto para una imagen ms grande.)

Paso 2: Visualizacin de los nombres y apellidos en una sola columna


En la actualidad, el nombre y apellido de cada empleado se muestran en una columna separada. Sera bueno para combinarlos en una sola columna, en su lugar. Para lograr esto, debemos utilizar un TemplateField . Podemos aadir una nueva TemplateField , aadirle el margen necesario y la sintaxis de enlace de datos, y luego eliminar elBoundFields llamado Nombre y Apellido , o bien podemos convertir la BoundFields nombre Nombre en unTemplateField , editar el TemplateField para incluir el LastName valor , y luego retire la BoundField llamadoLastName . Ambas aproximaciones a la red el mismo resultado, pero personalmente me gusta convertir BoundFields aTemplateFields , cuando sea posible, porque la conversin agrega automticamente un ItemTemplate yEditItemTemplate con controles web y la sintaxis de enlace de datos para imitar la apariencia y funcionalidad de laBoundField . La ventaja es que tendremos que hacer menos trabajo con el TemplateField , como el proceso de conversin se han realizado algunos trabajos para nosotros. Para convertir un BoundField en un TemplateField , haga clic en el Editar columnas enlace desde el GridView tag 's inteligente, que nos lleva a la Campos cuadro de dilogo. Seleccione la BoundField para convertir la lista en la esquina inferior izquierda, a continuacin, haga clic en el Convertir este campo en un TemplateField en la esquina inferior derecha.

Figura 4. Convertir un BoundField en un TemplateField en el cuadro de dilogo Campos. (Clic en la foto para una imagen ms grande.) Seguir adelante y convertir el BoundField nombre Nombre en un TemplateField . Despus de este cambio, no hay diferencia perceptiva en el Diseador. Esto se debe a la conversin de la BoundField en un TemplateField crea unTemplateField que mantiene la apariencia de la BoundField . A pesar de que haya ninguna diferencia visual en este momento en el diseador, este proceso de conversin ha sustituido a la BoundField 's Sintaxis declarativa-<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> con las siguientes TemplateField sintaxis:
<asp:TemplateField HeaderText="FirstName" SortExpression="FirstName"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Como puede ver, el TemplateField se compone de dos modelos: un ItemTemplate que tiene una etiqueta cuyo textopropiedad se establece en el valor del Nombre de campo de datos, y una EditItemTemplate que tiene un TextBoxcontrol cuyo texto la propiedad tambin se establece en el Nombre de datos sobre el terreno. El enlace de datos de la sintaxis <% # Bind ("nombre de campo")%> , indica que el fieldName campo de datos se enlaza a la propiedad de control Web especificado. Para agregar el Apellido de datos de campo valor a esta TemplateField , hay que aadir otra etiqueta de control Web en el ItemTemplate y unirse a su texto a la propiedad LastName . Esto se puede lograr ya sea a mano o mediante el Diseador. Para hacerlo a mano, slo tiene que aadir la sintaxis declarativa adecuada a la ItemTemplate :

<asp:TemplateField HeaderText="FirstName" SortExpression="FirstName"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: Label> <Asp: ID Label = "Label2" runat = "server" Texto ='<%# Bind ("LastName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Para agregar a travs del diseo, haga clic en el Editar plantillas de enlace desde el GridView tag 's inteligente. Esto mostrar el GridView 's de edicin de plantillas de interfaz. En la etiqueta inteligente de esta interfaz es una lista de las plantillas en el GridView . Debido a que slo tenemos un TemplateField en este punto, las plantillas slo aparece en la lista desplegable son las plantillas para el Nombre TemplateField , junto con el EmptyDataTemplate y PagerTemplate. El EmptyDataTemplate plantilla, si se especifica, se utiliza para representar el control GridView de salida 's si no hay resultados en los datos enlazados a la GridView , el PagerTemplate , si se especifica, se utiliza para representar la interfaz de paginacin para un GridView que admite la paginacin.

Figura 5. Plantillas de la GridView se puede editar a travs del diseo. (Clic en la foto para una imagen ms grande.) Para ver tambin la LastName en el Nombre TemplateField , arrastre la etiqueta de control de la caja de herramientas en el ItemTemplate del Nombre TemplateField en el GridView 's de edicin de plantillas de interfaz.

Figura 6. Agregue un control Web Label a la ItemTemplate TemplateField Nombre es. (Clic en la foto para una imagen ms grande.) En este punto, la etiqueta de control de Web agrega a la TemplateField tiene su texto conjunto de propiedades deetiquetas . Tenemos que cambiar esto, as que esta propiedad est ligada al valor de la LastName campo de datos, en su lugar. Para lograr esto, haga clic en la etiqueta de etiquetas inteligentes de control y elegir el DataBindings Editaropcin.

Figura 7. Elija la opcin Editar DataBindings de etiquetas inteligentes de la etiqueta. (Clic en la foto para una imagen ms grande.) Con ello se abre la DataBindings cuadro de dilogo. Desde aqu, usted puede seleccionar la propiedad a participar en el enlace de datos de la lista de la izquierda, y, en la lista desplegable a la derecha, seleccione el campo al que enlazar los datos. Elija el texto propiedad de la izquierda y el Apellido de campo de la derecha, y haga clic en Aceptar .

Figura 8. Obligar a la propiedad Text en el campo de datos LastName. (Clic en la foto para una imagen ms grande.) Nota El DataBindings cuadro de dilogo le permite indicar si se debe realizar de dos vas de enlace de datos. Si deja sin marcar, la sintaxis de enlace de datos <% # Eval ("LastName")%> se utilizar, en lugar de <% # Bind ("LastName")%> . Cualquiera de estos enfoques est muy bien para este tutorial. Enlace bidireccional de datos es importante cuando la insercin y edicin de datos. Para mostrar slo los datos, sin embargo, ambos enfoques funcionan igual de bien. Hablaremos de dos vas de enlace de datos en detalle, en futuros tutoriales. Tome un momento para ver esta pgina en un navegador. Como puede ver, el GridView todava incluye cuatro columnas, sin embargo, el Nombre de columna ya las listas de ambos el Nombre y Apellido valores de los datos de campo.

Figura 9. Tanto el Nombre y Apellido valores se muestran en una sola columna. (Clic en la foto para una imagen ms grande.) Para completar este primer paso, quitar el LastName BoundField , y cambiar el nombre del HeaderText propiedad delNombre TemplateField a "Nombre". Despus de estos cambios, el GridView marcado 's declarativo debe tener el siguiente aspecto:
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "EmployeeID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: TemplateField HeaderText = "Nombre" SortExpression = "Nombre"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server"

Texto ='<%# Bind ("Nombre") %>'></ asp: Label> <Asp: ID Label = "Label2" runat = "server" Texto ='<%# Eval ("LastName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField> <Asp: BoundField DataField = "Ttulo" HeaderText = "Ttulo" SortExpression = "Ttulo" /> <Asp: BoundField DataField = "HireDate" HeaderText = "Fecha de contratacin" SortExpression = "Fecha de contratacin" /> </ Columns> </ Asp: GridView>

Figura 10. Nombre y apellido de cada empleado se muestran en una columna. (Clic en la foto para una imagen ms grande.)

Paso 3: Con el control Calendar para mostrar el campo HireDate


Viendo un valor de datos de campo como texto en un GridView es tan fcil como usar un BoundField . En ciertos casos, sin embargo, los datos se expresa mejor mediante un control de Web en particular en lugar de slo texto. Esta adaptacin de la visualizacin de datos es posible con un TemplateField . Por ejemplo, en lugar de mostrar la fecha del empleado de alquiler en forma de texto, que podra mostrar un calendario (con el control de calendario ), con fecha del empleado de alquiler resaltado. Para lograr esto, comenzar por la conversin de la BoundField llamado HireDate en un TemplateField . Slo tienes que ir a la GridView tag 's inteligente y haga clic en el Editar columnas enlace, que nos lleva a la Campos cuadro de dilogo. Seleccione la BoundField llamado HireDate , y haga clic en Convertir este campo en un TemplateField .

Figura 11. Convertir el HireDate BoundField en un TemplateField. (Clic en la foto para una imagen ms grande.) Como vimos en el paso 2, este reemplazar al BoundField con un TemplateField que contiene un ItemTemplate yEditItemTemplate con una etiqueta y cuadro de texto cuyo texto propiedades estn obligados a la HireDate valor utilizando la sintaxis de enlace de datos <% # Bind ("Fecha de contratacin") %> . Para reemplazar el texto con un calendario de control, modificar la plantilla mediante la eliminacin de la etiqueta y la adicin de un calendario de control. Desde el diseo, seleccione Editar plantillas de la GridView tag 's inteligente y, a partir de la lista desplegable, elija el ItemTemplate del HireDate TemplateField . A continuacin, elimine la etiqueta de control y arrastre un calendario de control de la caja de herramientas en la interfaz de edicin de plantillas.

Figura 12. Agregue un control de calendario para el ItemTemplate TemplateField HireDate es. (Clic en la foto para una imagen ms grande.) En este punto, cada fila de la GridView contendr un calendario de control en su HireDate TemplateField . Sin embargo, el empleado actual HireDate valor no est establecido en cualquier parte del calendario de control, lo que hace que cada calendario de control por defecto para mostrar el mes en curso y la fecha. Para remediar esto, tenemos que asignar a cada empleado HireDate al Calendario control SelectedDate y VisibleDate propiedades. Desde el Calendario de etiquetas inteligentes de control, seleccione Editar DataBinding . Se unen al lado, tanto elSelectedDate y VisibleDate propiedades a la HireDate campo de datos.

Figura 13. Enlazar las propiedades SelectedDate y VisibleDate al campo de datos HireDate. (Clic en la foto para una imagen ms grande.) Nota El calendario de fechas seleccionado control no necesariamente tiene que ser visible. Por ejemplo, un calendario podra tener 01 de agosto 1999, como la fecha seleccionada, pero se muestra el mes y ao actuales. La fecha seleccionada y la fecha visible son especificados por el calendario de control deSelectedDate y VisibleDate propiedades. Porque queremos tanto a seleccionar el empleado HireDate y asegrese de que est demostrado, hay que unir ambas propiedades a la HireDate campo de datos. Al consultar la pgina en un navegador, el calendario muestra ahora el mes de la fecha de contratacin del trabajador y elige esa fecha en particular.

Figura 14. Fecha de contratacin del empleado se muestra en el control Calendar. (Clic en la foto para una imagen ms grande.) Nota A diferencia de todos los ejemplos que hemos visto hasta ahora, para este tutorial que hicimos noestablecer el EnableViewState propiedad a falso para este GridView . La razn de esta decisin es que haciendo clic en las fechas del calendario de control provoca una post-back, ajuste de la fecha seleccionada del calendario a la fecha acaba de hacer clic. Si el GridView 'estado s de vista est deshabilitado, no obstante, en cada postback, el GridView de datos de s es de rebote a su origen de datos subyacente, lo que hace que la fecha seleccionada del calendario para establecer de nuevo a los empleados HireDate , sobrescribiendo la fecha elegida por el usuario.

Para este tutorial, esta es una discusin irrelevante, porque el usuario no es capaz de actualizar el empleado Fecha de contratacin . Probablemente sera mejor para configurar el calendario de control, por lo que sus fechas no son seleccionables. De cualquier manera, este tutorial muestra que en algunas circunstancias, el estado de vista deben estar habilitadas en el fin de proporcionar una cierta funcionalidad.

Paso 4: Muestra el nmero de das que el empleado haya trabajado para la empresa
Hasta ahora, hemos visto dos aplicaciones de TemplateField s:

La combinacin de dos o ms campos de datos los valores en una columna Expresar un valor de datos de campo mediante un control de Web en lugar de texto

Un tercer uso de TemplateField s est en la visualizacin de los metadatos sobre el GridView de datos 's subyacente.Adems de mostrar las fechas de los empleados de alquiler, por ejemplo, tambin puede ser que desee tener una columna que muestra el nmero total de das que han estado en el trabajo. Sin embargo, otro uso de TemplateField s se presenta en escenarios en los que los datos subyacentes deben mostrarse de forma diferente en el informe de la pgina Web de la forma en que se almacena en la base de datos.Imagina que en la tabla empleados tiene un campo de Gnero, que almacena el carcter M o F, para indicar el sexo del empleado. Cuando se muestra esta informacin en una pgina Web, que puede ser que desee para mostrar el sexo como "masculino" o "Mujeres", en lugar de slo "M" o "F". En estos dos casos pueden ser manejados por la creacin de un mtodo de formato en la clase de cdigo subyacente de la pgina ASP.NET (o en una biblioteca de clases separadas, implementado como una esttica mtodo) que se invoca desde la plantilla. Como un mtodo de formato se invoca desde la plantilla utilizando la misma sintaxis de enlace de datos visto antes. El mtodo de formato puede tomar en cualquier nmero de parmetros, sino que debe devolver una cadena. Esta cadena se devuelve el cdigo HTML que se inyecta en la plantilla. Para ilustrar este concepto, vamos a aumentar nuestro tutorial para mostrar una columna que muestra el nmero total de das que un empleado ha estado en el trabajo. Este mtodo de formato se llevar en un Northwind.EmployeesRowobjeto y devolverlo como una cadena el nmero de das que el empleado ha trabajado. Este mtodo se puede agregar al cdigo subyacente de la pgina ASP.NET de clase, pero deben ser marcados como protegidos o pblicos con el fin de ser accesible desde la plantilla.
protegidos cadena DisplayDaysOnJob (empleado Northwind.EmployeesRow) { / / Hacer HireDate que no es nulo ... si es as, volver "Desconocido" if (employee.IsHireDateNull ()) return "Desconocido"; ms

{ / / Devuelve el nmero de das entre la corriente / / Fecha / hora y HireDate TimeSpan = ts DateTime.Now.Subtract (employee.HireDate); volver ts.Days.ToString ("#,## 0 "); } }

Debido a que el HireDate campo puede contener NULL los valores de base de datos, primero debe asegurarse de que el valor no es NULL antes de proceder con el clculo. Si el HireDate valor es NULL , slo devuelve la cadena "desconocido", y si no es NULL , se calcula la diferencia entre la hora y la Fecha de contratacin de valores, y devolver el nmero de das. Para utilizar este mtodo, debemos invocarlo desde un TemplateField en el GridView utilizando la sintaxis de enlace de datos. Empezar por agregar una nueva TemplateField a la GridView haciendo clic en el Editar columnas enlace en elGridView tag 's inteligente y aadiendo una nueva TemplateField .

Figura 15. Aadir un TemplateField Nuevo en el GridView. (Clic en la foto para una imagen ms grande.) Establecer el HeaderText propiedad de este nuevo TemplateField de das en el trabajo y la HorizontalAlignpropiedad de sus ItemStyle al Centro . Para llamar a la DisplayDaysOnJob mtodo de la plantilla, agregar unItemTemplate y utilizar el siguiente enlace de datos de la sintaxis:
<% # DisplayDaysOnJob ((Northwind.EmployeesRow) (System.Data.DataRowView) Container.DataItem). Row)%>

Container.DataItem devuelve un DataRowView objeto que se corresponde con el DataSource registro enlazado a laGridViewRow . Su fila propiedad devuelve el

establecimiento inflexible de tipos Northwind.EmployeesRow , que se pasa a la DisplayDaysOnJob mtodo. Esta sintaxis de enlace de datos puede aparecer directamente en elItemTemplate (como se muestra en la sintaxis declarativa que sigue) o puede ser asignado al texto de propiedad de una etiqueta de control Web. Nota Como alternativa, en lugar de pasar de un EmployeesRow ejemplo, que slo podra pasar en elHireDate valor mediante <% # DisplayDaysOnJob (Eval ("Fecha de contratacin"))%> . Sin embargo, la Eval mtodo devuelve un objeto , por lo que tendramos que cambiar nuestraDisplayDaysOnJob firma del mtodo para aceptar un parmetro de entrada del tipo de objeto , en su lugar. No a ciegas puede lanzar la Eval ("Fecha de contratacin") llamada a una fecha y hora , porque elHireDate columna en la tabla Empleados puede contener NULL valores. Por lo tanto, tendra que aceptar un objeto como el parmetro de entrada para el DisplayDaysOnJob mtodo, comprobar para ver si haba una base de datos NULL valor (que se puede lograr mediante el uso de Convert.IsDBNull (objectToCheck ) ), y luego actuar en consecuencia. Debido a estas sutilezas, he optado por pasar toda la EmployeesRow ejemplo. En el siguiente tutorial vamos a ver un ejemplo ms apropiado para el uso de la Eval (" columnName ") sintaxis para pasar un parmetro de entrada en un mtodo de formato. A continuacin se muestra la sintaxis declarativa para nuestro GridView despus de que el TemplateField se ha agregado y la DisplayDaysOnJob mtodo llamado de la ItemTemplate :
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "EmployeeID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: TemplateField HeaderText = "Nombre" SortExpression = "Nombre"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("Nombre") %>'></ asp: Label> <Asp: ID Label = "Label2" runat = "server" Texto ='<%# Eval ("LastName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField> <Asp: BoundField DataField = "Ttulo" HeaderText = "Ttulo" SortExpression = "Ttulo" /> <Asp: TemplateField HeaderText = "Fecha de contratacin" SortExpression = "HireDate">

<EditItemTemplate> <Asp: TextBox ID = "TextBox2" runat = "server" Texto ='<%# Bind ("Fecha de contratacin") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: Calendar ID = "Calendar1" runat = "server" SelectedDate ='<%# Bind ("Fecha de contratacin")%> ' VisibleDate ='<%# Eval ("Fecha de contratacin")%> '> </ Asp: Calendar> </ ItemTemplate> </ Asp: TemplateField> <asp:TemplateField HeaderText="Days En El Job"> <ItemTemplate> <% # DisplayDaysOnJob ((Northwind.EmployeesRow) ((System.Data.DataRowView) Container.DataItem). Row)%> </ ItemTemplate> <ItemStyle HorizontalAlign="Center" /> </ Asp: TemplateField> </ Columns> </ Asp: GridView>

La figura 16 muestra el tutorial completo, cuando se ve a travs de un navegador.

Figura 16. Nmero de das ha sido empleado en el trabajo (Clic en la foto para una imagen ms grande)

Conclusin

El TemplateField en el GridView de control permite un mayor grado de flexibilidad en la visualizacin de los datos que est disponible con los controles de otro tipo. Un TemplateField es ideal para situaciones en las que:

Campos de datos deben ser exhibidos en un GridView columna. Los datos se expresan mejor mediante un control de Web, en lugar de texto plano. La salida depende de los datos subyacentes, como la visualizacin de los metadatos o en formato a los datos.

Adems de personalizar la visualizacin de datos, un TemplateField se utiliza tambin para la personalizacin de las interfaces de usuario utilizado para la edicin y la insercin de datos, como veremos en futuros tutoriales. Los siguientes dos tutoriales continuar explorando las plantillas, a partir de una mirada en el uso de TemplateField s en un DetailsView . A continuacin, pasaremos a la FormView , que utiliza las plantillas en lugar de campos para proporcionar una mayor flexibilidad en el diseo y la estructura de los datos.

Tutorial 13: Uso de TemplateFields en DetailsView


Scott Mitchell 02 2007 Resumen: El TemplateField en el DetailsView de control permite un mayor grado de flexibilidad en la visualizacin de datos que est disponible con los controles de campo, y es ideal para mltiples situaciones, muchas de las cuales se discuten en este tutorial. (14 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 13 (Visual C #) Introduccin Paso 1: unin de los datos para el DetailsView Paso 2: La combinacin de los precios, las unidades en stock, y las Unidades de Orden en una fila de formato el precio de una moneda agregar los campos de datos que permanecen a la TemplateField Paso 3: Personalizacin de la informacin de campo interrumpidas conclusin

Introduccin

El TemplateField ofrece un mayor grado de flexibilidad en la representacin de datos de la BoundField ,CheckBoxField , HyperLinkField , y otros controles de datos de campo. En el tutorial anterior vimos con elTemplateField en un GridView a:

Varias pantallas de datos de campo, los valores en una columna. En concreto, tanto el Nombre y Apellidocampos se combinaron en un GridView columna. Utilizar un control Web alternativo para expresar un valor de datos de campo. Hemos visto cmo para mostrar elHiredDate valor con un calendario de control. Mostrar la informacin de estado sobre la base de los datos subyacentes. Mientras que la tabla Empleados no contiene una columna que devuelve el nmero de das que un empleado ha estado en el trabajo, hemos sido capaces de mostrar esa informacin en el GridView ejemplo en el tutorial anterior, con el uso de unTemplateField mtodo y el formato.

Lo mismo TemplateFields capacidades disponibles con el GridView tambin estn disponibles con el DetailsViewcontrol. En este tutorial vamos a mostrar un producto a la vez usando un DetailsView que contiene dos TemplateFields. La primera TemplateField combinar la PrecioUnidad , UnitsInStock y UnitsOnOrder campos de datos en unDetailsView fila. El segundo TemplateField mostrar el valor de las interrumpidas campo, sino que utilizan un mtodo de formato para mostrar S si interrumpidas es cierto , y NO lo contrario.

Figura 1. Dos TemplateFields se utilizan para personalizar la pantalla. (Clic en la foto para una imagen ms grande.) Vamos a empezar!

Paso 1: unin de los datos para el DetailsView


Como se discuti en el tutorial anterior, cuando se trabaja con TemplateField s es a menudo ms fcil empezar por crear el DetailsView control que contiene

slo BoundField s y luego aadir nuevas TemplateField s o convertir la actual BoundField s para TemplateField s, segn sea necesario. Por lo tanto, comenzar este tutorial, aadiendo unDetailsView a la pgina a travs del diseo y enlazarlo a un ObjectDataSource que devuelve la lista de productos.Estas medidas contribuirn a crear un DetailsView con BoundField s para cada uno de los campos de los productos de valor no-booleano y un CheckBoxField para el campo de valor de un booleano (descatalogados). Abra la pgina DetailsViewTemplateField.aspx y arrastre un DetailsView del cuadro de herramientas hasta el diseador.Desde el DetailsView tag 's inteligente optar por aadir un nuevo ObjectDataSource control que invoca el ProductsBLLclase GetProducts () mtodo.

Figura 2. Aadir un nuevo control ObjectDataSource que llama a la GetProducts () mtodo. (Clic en la foto para una imagen ms grande.) Para este informe, retirar el ProductID , IdProveedor , CategoryID , y ReorderLevel BoundField s. A continuacin, cambiar el orden de BoundField s para que el CategoryName y SupplierName BoundField s aparecen inmediatamente despus de la ProductName BoundField . Sintase libre para ajustar el HeaderText propiedades y las propiedades de formato para la BoundField s como mejor le parezca. Al igual que con el GridView , estos BoundFieldnivel ediciones se pueden realizar a travs de los campos de cuadro de dilogo (se accede haciendo clic en el Editar campos enlace en el DetailsView tag 's inteligente) o por medio de la sintaxis declarativa. Por ltimo, limpiar elDetailsView 's Altura y Ancho los valores de la propiedad con el fin de permitir que el DetailsView para ampliar el control sobre la base de los datos mostrados y comprobar la paginacin Activar casilla de verificacin de la etiqueta inteligente.

Despus de realizar estos cambios, el DetailsView marcado declarativo del control debe ser similar a lo siguiente:
<Asp: DetailsView ID = "DetailsView1" runat = "server" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True" EnableViewState = "false"> <Fields> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "Cantidad / Unidad" SortExpression = "CantidadPorUnidad" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "Precio" SortExpression = "UnitPrice" /> <Asp: BoundField DataField = "UnitsInStock" HeaderText = "Unidades en Stock" SortExpression = "UnitsInStock" /> <Asp: BoundField DataField = "UnitsOnOrder" HeaderText = "unidades en pedido" SortExpression = "UnitsOnOrder" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> </ Campos> </ Asp: DetailsView>

Tome un momento para ver la pgina a travs de un navegador. En este punto usted debe ver a un solo producto la lista (Chai), con filas que muestra el nombre del producto, categora, proveedores, precios, unidades en stock, unidades pedidas, y su estado suspendido.

Figura 3. Detalles del producto se muestran usando una serie de BoundFields. (Clic en la foto para una imagen ms grande.)

Paso 2: La combinacin de los precios, las unidades en stock, y las Unidades de Orden en una fila
El DetailsView tiene una fila para el PrecioUnidad , UnitsInStock y UnitsOnOrder campos. Podemos combinar estos campos de datos en una sola fila con un TemplateField ya sea mediante la adicin de un nuevo TemplateField o mediante la conversin de uno de los existentes PrecioUnidad , UnitsInStock y UnitsOnOrder BoundField s en unTemplateField . Aunque yo personalmente prefiero convertir existentes BoundField s, vamos a la prctica mediante la adicin de un nuevo TemplateField . Comience por hacer clic en el Editar campos enlace en el DetailsView tag 's inteligente para abrir el Campos cuadro de dilogo. A continuacin, agregue un nuevo TemplateField y establecer su HeaderText propiedad a precios e inventario y mover el nuevo TemplateField para que se site por encima de la PrecioUnidad BoundField .

Figura 4. Aadir un nuevo TemplateField al control DetailsView. (Clic en la foto para una imagen ms grande.) Debido a que este nuevo TemplateField contendr los valores que se muestra actualmente en el PrecioUnidad ,UnitsInStock y UnitsOnOrder BoundField s, vamos a eliminarlos. La ltima tarea para este paso es definir el ItemTemplate marcado por el precio y el Inventario de TemplateField , que se puede lograr a travs del DetailsView interfaz 's edicin de plantillas en el Diseador, o con la mano a travs de una sintaxis declarativa del control. Al igual que con el GridView , el DetailsView plantilla 's interfaz de edicin se puede acceder haciendo clic en el Editar plantillas de enlace en la etiqueta inteligente. Desde aqu se puede seleccionar la plantilla que desea editar en la lista desplegable y luego aadir los controles Web de la caja de herramientas. Para este tutorial, empezar por agregar una etiqueta de control para el precio y el Inventario de TemplateField 'sItemTemplate . A continuacin, haga clic en el Editar DataBinding enlace de la Web Label de etiquetas inteligentes de control y obligar a la del texto de la propiedad Precio por unidad de campo.

Figura 5. Enlazar la propiedad Text de la etiqueta para el campo de datos Precio por unidad. (Clic en la foto para una imagen ms grande.)

Formato el precio de una moneda


Con esta incorporacin, la web de etiquetas de control de precios e inventario TemplateField mostrar ahora slo el precio para el producto seleccionado. La figura 6 muestra una captura de pantalla de nuestro progreso hasta ahora cuando se ve a travs de un navegador.

Figura 6. El precio y el Inventario de TemplateField muestra el precio. (Clic en la foto para una imagen ms grande.) Tenga en cuenta que el precio del producto no est formateado como moneda. Con un BoundField , el formato es posible mediante el establecimiento de la HtmlEncode propiedad falsos y la DataFormatString propiedad { 0 : formatSpecifier} . Para un TemplateField , sin embargo, todas las instrucciones de formato debe ser especificado en la sintaxis de enlace de datos, o mediante el uso de un mtodo de formato definido en alguna parte del cdigo de la aplicacin (como en el cdigo subyacente de la pgina ASP.NET de clase). Para especificar el formato de la sintaxis de enlace de datos utilizados en la Web de etiquetas de control, vuelva a laDataBindings cuadro de dilogo haciendo clic en el Editar DataBinding enlace de la etiqueta tag 's inteligente. Puede escribir las instrucciones de formato directamente en el formato de la lista desplegable, o seleccionar una de las cadenas de formato definidas. Al igual que con la BoundField 's DataFormatString propiedad, el formato se especifica mediante { 0 : formatSpecifier} . Para el PrecioUnidad campo, utilice el formato de moneda especificado seleccionando el desplegable correspondiente valor de la lista o escribiendo {0: C} con la mano.

Figura 7. Formato del precio de una moneda. (Clic en la foto para una imagen ms grande.) Declaracin, la especificacin de formato se indica como un segundo parmetro a la vinculacin o Eval mtodo. Los ajustes que acaba de hacer a travs de los resultados de diseo en el siguiente enlace de datos de expresin en el marcado declarativo:
<Asp: ID Label = "Label1" runat = "server" Text ='<%# Eval ("Precio por unidad", "{0: C}") %>'/>

Adicin de los campos de datos restante a la TemplateField


En este punto hemos mostrado y el formato de la PrecioUnidad campo de datos en el precio y el Inventario deTemplateField , pero an debe mostrar la UnitsInStock y UnitsOnOrder campos. Vamos a mostrar estos en una lnea por debajo del precio y entre parntesis. Desde la interfaz de edicin de plantillas en el Diseador, marcado como se puede agregar colocando el cursor dentro de la plantilla y simplemente escribiendo el texto que se mostrar. Por otra parte, este marcado se pueden introducir directamente en la sintaxis declarativa. Agregue el marcado esttico, etiquetas Web controles, y la sintaxis de enlace de datos, por lo que el precio e inventario TemplateField muestra el precio y la informacin del inventario de la siguiente manera: Precio por unidad (En archivo / Pedido: UnitsInStock / UnitsOnOrder ) Despus de realizar esta tarea, el DetailsView marcado 's declarativo debe ser similar a lo siguiente:
<Asp: DetailsView ID = "DetailsView1" runat = "server" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True" EnableViewState = "false"> <Fields> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "Cantidad / Unidad" SortExpression = "CantidadPorUnidad" /> <asp:TemplateField HeaderText="Price y Inventory"> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Eval ("Precio por unidad", "{0: C}") %>'></ asp: Label>

<br /> <strong> (En archivo / Pedido: </ strong> <Asp: ID Label = "Label2" runat = "server" Texto ='<%# Eval ("UnitsInStock") %>'></ asp: Label> <strong> / </ strong> <Asp: Label = ID "Label3" runat = "server" Texto ='<%# Eval ("UnitsOnOrder")%> '> </ Asp: Label> <strong>) </ strong> </ ItemTemplate> </ Asp: TemplateField> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> </ Campos> </ Asp: DetailsView>

Con estos cambios, hemos consolidado la informacin de precios y el inventario en un solo DetailsView fila.

Figura 8. La informacin sobre los precios y el inventario se muestra en una sola fila. (Clic en la foto para una imagen ms grande.)

Paso 3: Personalizacin de la informacin de campo interrumpidas


Los productos de mesa interrumpidas columna es un valor bit que indica si el producto ha sido descontinuado. Al enlazar un DetailsView (o GridView ) para un control de origen de datos, el valor booleano campos-comointerrumpidas , se implementan como CheckBoxField s, mientras que los no-booleano campos-como el valor deProductID , ProductName , y as sucesivamente, se implementan como BoundField s. El CheckBoxField se muestra como una casilla de verificacin con discapacidad que se comprueba si el valor del campo de datos es cierto , y sin control de otra manera. En lugar de mostrar la CheckBoxField , que puede ser que desee mostrar en lugar de texto que indica si el producto est descatalogado. Para lograr esto, se podra eliminar el CheckBoxField de la DetailsView y luego aadir unBoundField cuya DataField propiedad se estableci en descatalogados . Tmese un momento para hacer esto.Despus de este cambio, el DetailsView muestra el texto verdadero de productos discontinuados y falsas de los productos que todava estn activos.

Figura 9. Las cadenas de verdadero y falso se utilizan para mostrar el estado suspendido. (Clic en la foto para una imagen ms grande.) Imagina que no queramos las cuerdas verdadero o falso para ser utilizado, pero S y NO en su lugar. Esta adaptacin se puede realizar con la ayuda de un TemplateField y un mtodo de formato. Un mtodo de formato puede tomar en cualquier nmero de parmetros de entrada, pero debe devolver el HTML (como una cadena) para inyectar en la plantilla. Agregar un mtodo de formato para clase de cdigo subyacente de la pgina DetailsViewTemplateField.aspx llamadoDisplayDiscontinuedAsYESorNO que acepta un Northwind.ProductsRow objeto como un parmetro de entrada y devuelve una

cadena. Como se discuti en el tutorial anterior, este mtodo debe ser marcado como protegido opblico con el fin de ser accesible desde la plantilla.
Protegidos funcin DisplayDiscontinuedAsYESorNO (suspendido como Boolean) As String Si descontinuado Retorno "SI" Ms Retorno "NO" End If End Function

Este mtodo comprueba el parmetro de entrada ( suspendido ) y devuelve S si es cierto , y NO lo contrario. Nota En el mtodo de formato examinar en el tutorial anterior, recuerdo que estbamos pasando en un campo de datos que puede contener NULL s, y por lo tanto, es necesario comprobar si el empleadoHiredDate valor de la propiedad haba una base de datos NULL valor antes de acceder alEmployeesRow 's HiredDate la propiedad. Esta comprobacin no es necesaria aqu, ya que elinterrumpidas columna no puede tener la base de datos NULL los valores asignados. Por otra parte, es por eso que el mtodo puede aceptar un parmetro de entrada booleana en lugar de tener que aceptar un ProductsRow instancia o un parmetro de tipo de objeto . Con este mtodo de formato completo, todo lo que queda es para llamar desde el TemplateField 's ItemTemplate .Para crear el TemplateField , quite el interrumpidas BoundField y aadir una nueva TemplateField , o convertir elinterrumpidas BoundField en un TemplateField . Luego, desde el punto de vista marcado declarativo, editar elTemplateField para que contenga slo un ItemTemplate que invoca el DisplayDiscontinuedAsYESorNO mtodo, pasando el valor de la corriente ProductRow instancia interrumpidas propiedad. Esto se puede acceder mediante el uso de la Eval mtodo. En concreto, el TemplateField marcado 's deben tener el siguiente aspecto:
<Asp: TemplateField HeaderText = "interrumpidas" SortExpression = "interrumpidas"> <ItemTemplate> <% # DisplayDiscontinuedAsYESorNO ((bool) Eval ("interrumpidas"))%> </ ItemTemplate> </ Asp: TemplateField>

Esto har que el DisplayDiscontinuedAsYESorNO mtodo que se invoca cuando se representa la DetailsView , pasando el ProductRow instancia interrumpidas valor. Dado que la Eval mtodo devuelve un

valor de tipo de objeto , pero el DisplayDiscontinuedAsYESorNO mtodo espera un parmetro de entrada de tipo Boolean , que tire la Evalvalor mtodo de devolucin de Boole . El DisplayDiscontinuedAsYESorNO mtodo volver entonces S o NO , segn el valor que recibe. El valor devuelto es lo que se muestra en este DetailsView fila (ver figura 10).

Figura 10. SI o NO los valores se muestran ahora en la fila interrumpidas. (Clic en la foto para una imagen ms grande.)

Conclusin
El TemplateField en el DetailsView de control permite un mayor grado de flexibilidad en la visualizacin de los datos que est disponible con los controles de campo, y es ideal para situaciones en las que:

Campos de datos deben ser exhibidos en un GridView columna. Los datos se expresan mejor mediante un control de Web, en lugar de texto plano. La salida depende de los datos subyacentes, como la visualizacin de los metadatos o en formato a los datos.

Mientras TemplateField s permiten un mayor grado de flexibilidad en la prestacin de los DetailsView datos 's subyacente, el DetailsView de salida todava se siente un poco cuadrado, ya que cada campo se representa como una fila en un HTML <table> . El FormView de control ofrece un mayor grado de flexibilidad en la configuracin de la salida representada. ElFormView no contiene campos, sino simplemente una serie de plantillas ( ItemTemplate , EditItemTemplate ,HeaderTemplate , y as sucesivamente). Vamos a ver cmo utilizar el FormView para lograr un mayor control de la disposicin dictada por el tutorial que viene.

Tutorial 14: Uso de las plantillas del FormView


Scott Mitchell 02 2007 Resumen: En este tutorial, Scott Mitchell muestra cmo utilizar el FormView de control para un diseo ms flexible al mostrar un nico registro. (8 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 14 (Visual C #) Introduccin Paso 1: Enlace de los datos a los controles FormView Paso 2: Definicin de la ItemTemplate de marcado Conclusin

Introduccin
En los ltimos dos tutoriales, hemos visto cmo personalizar el control GridView y DetailsView salidas de los controles "usando TemplateFields . TemplateFields permitir el contenido de un campo especfico para ser altamente personalizados, pero al final tanto el GridView y DetailsView tiene un lugar cerrado, de la red -como aspecto. En muchas situaciones, como un diseo de cuadrcula, como es lo ideal, pero a veces una forma ms fluida, mostrar menos rgido que se necesita. Cuando se muestra un registro nico, como un diseo fluido es posible utilizar el FormViewcontrol. A diferencia de los DetailsView , el FormView no se compone de los campos. No se puede agregar un BoundField oTemplateField a un FormView . En cambio, el FormView se representa mediante plantillas. Piense en el FormViewcomo DetailsView de control que contiene un nico TemplateField . El FormView soporta las siguientes plantillas:

ItemTemplate : se utiliza para hacer el registro en particular se muestra en el FormView . HeaderTemplate -Se utiliza para especificar una fila de encabezado opcional. FooterTemplate -Se utiliza para especificar una fila de pie opcional. EmptyDataTemplate -Cuando el FormView 's DataSource carece de registros, el EmptyDataTemplate se utiliza en lugar de la ItemTemplate para la prestacin de marcado del control.

PagerTemplate -Se puede utilizar para personalizar la interfaz de paginacin para FormView s que han permitido a la paginacin. EditItemTemplate / InsertItemTemplate -Se usa para personalizar la interfaz de edicin o de la interfaz de insercin para FormView s que soportan esta funcionalidad.

En este tutorial, vamos a examinar con el FormView de control de presentar una pantalla de menos rgida de los productos. En lugar de tener campos para el nombre, categora, proveedor, y as sucesivamente, el FormView 'sItemTemplate se muestran estos valores mediante una combinacin de un elemento de cabecera y un <table> (ver Figura 1).

Figura 1. El FormView sale de la cuadrcula de diseo similar al visto en el DetailsView. (Clic en la foto para una imagen ms grande)

Paso 1: Enlace de los datos a los controles FormView


Abra el FormView.aspx pgina y arrastrar un FormView del cuadro de herramientas hasta el diseador. La primera vez que la adicin de la FormView aparece como un cuadro gris, ensendonos que un ItemTemplate es necesario.

Figura 2. El FormView no se puede representar en el Diseador de hasta un ItemTemplate se proporciona. (Clic en la foto para una imagen ms grande) El ItemTemplate puede ser creada a mano (a travs de la sintaxis declarativa) o puede ser auto-creado por la unin delFormView a un control de origen de datos mediante el Diseador. Esta auto-creado ItemTemplate contiene HTML que muestra el nombre de cada campo y una etiqueta de control, cuyo texto se une a la propiedad el valor del campo. Este enfoque tambin auto-crea un InsertItemTemplate y EditItemTemplate , los cuales se rellenan con los controles de entrada para cada uno de los campos de datos devueltos por el control del origen de datos. Si desea crear automticamente la plantilla, desde el FormView tag 's inteligente aadir un nuevo ObjectDataSourcecontrol que invoca el ProductsBLL clase GetProducts () mtodo. Esto crear un FormView con ItemTemplate,InsertItemTemplate, y EditItemTemplate . Desde la vista Cdigo fuente, quitar el InsertItemTemplate yEditItemTemplate ya que no est interesado en la creacin de un FormView que admita la edicin o insercin todava.A continuacin, limpiar el margen dentro del ItemTemplate para que podamos tener un borrn y cuenta nueva para trabajar. Si prefiere construir el ItemTemplate manualmente, puede agregar y configurar el ObjectDataSource arrastrndolo desde la caja de herramientas hasta el diseador. Sin embargo, no se establece la FormView 's origen de datos del Diseador. En su lugar, vaya a la vista Cdigo fuente y configurar manualmente el FormView 's DataSourceIDpropiedad a la identificacin de valor de la ObjectDataSource . A continuacin, agregue manualmente elItemTemplate . Independientemente de qu enfoque que decidi tomar, en este punto su FormView marcado 's declarativo debe tener el siguiente aspecto:
<Asp: FormView ID = "FormView1" runat = "server" DataSourceID = "ObjectDataSource1"> <ItemTemplate>

</ ItemTemplate> </ Asp: FormView>

Tome un momento para comprobar la paginacin Activar casilla de verificacin en el FormView 's etiqueta inteligente, lo que se agrega el AllowPaging = "True" atribuir a la FormView 's sintaxis declarativa. Adems, ponga laEnableViewState propiedad a Falso .

Paso 2: Definicin de marcado de la ItemTemplate de


Con el FormView enlazado a la ObjectDataSource control y configurado para admitir la paginacin, estamos listos para especificar el contenido de la ItemTemplate . Para este tutorial, vamos a tener el nombre del producto aparece en un <h3> ttulo. Despus de eso, vamos a usar un HTML <table> para mostrar las propiedades del producto que queda en una tabla de cuatro columnas en las columnas primera y la tercera lista de los nombres de propiedades y la lista de segundo y cuarto de sus valores. Este marcado se pueden introducir a travs de la FormView interfaz 's edicin de plantillas en el Diseador o introducir manualmente a travs de la sintaxis declarativa. Cuando se trabaja con plantillas que generalmente resulta ms rpido trabajar directamente con la sintaxis declarativa, pero no dude en utilizar cualquier tcnica que se sientan ms cmodos. El marcado siguiente se muestra el FormView marcado declarativo despus de la ItemTemplate estructura 's se ha completado:
<Asp: FormView ID = "FormView1" runat = "server" DataSourceID = "ObjectDataSource1" AllowPaging = "True" EnableViewState = "false"> <ItemTemplate> <hr /> <h3> <% # Eval ("ProductName")%> </ h3> <table border="0"> <tr> <td class="ProductPropertyLabel"> Categora: </ td> <td class="ProductPropertyValue"> <% # Eval ("NombreCategora")%> </ td> <td class="ProductPropertyLabel"> Proveedor: </ td> <td class="ProductPropertyValue">

<% # Eval ("SupplierName ")%></ td> </ Tr> <tr> <td class="ProductPropertyLabel"> Precio: </ td> <td class="ProductPropertyValue"> <% # Eval ("Precio por unidad", "{0: C}")%> </ td> <td unidades class="ProductPropertyLabel"> En Stock: </ td> <td class="ProductPropertyValue"> <% # Eval ("UnitsInStock ")%></ td> </ Tr> <tr> <td unidades class="ProductPropertyLabel"> Pedido: </ td> <td class="ProductPropertyValue"> <% # Eval ("UnitsOnOrder")%> </ td> <td class="ProductPropertyLabel"> nivel de pedido: </ td> <td class="ProductPropertyValue"> <% # Eval ("ReorderLevel ")%></ td> </ Tr> <tr> <td class="ProductPropertyLabel"> Cantidad / Unidad </ td> <td class="ProductPropertyValue"> <% # Eval ("CantidadPorUnidad")%> </ td> <td class="ProductPropertyLabel"> Discontinuado: </ td> <td class="ProductPropertyValue"> <Asp: CheckBox runat = "server" Enabled = "false" Comprobar ='<%# Eval ("interrumpidas")%> '/> </ Td> </ Tr> </ Table> <hr /> </ ItemTemplate> </ Asp: FormView>

Tenga en cuenta que los datos de la sintaxis de enlace- <%% # Eval ("ProductName")> , por ejemplo-puede ser inyectado directamente en la salida de la plantilla. Es decir, no tiene que ser asignado a una etiqueta de control detexto de propiedad. Por ejemplo, tenemos el ProductName valor que aparece en un <h3> elemento mediante <h3> <% # Eval ("ProductName")%> </ h3> , que para el producto Chai se representan como <h3> Chai </ h3 > . El ProductPropertyLabel y ProductPropertyValue clases CSS se utilizan para especificar el estilo de los nombres de productos y valores de propiedades en el <table> . Estas clases CSS se definen en styles.css y hacer que los nombres de propiedad a ser valientes y alineados a la derecha y aadir un relleno derecho a los valores de propiedad. Porque no hay CheckBoxFields disponible con el FormView , con el fin de mostrar la interrumpidas valor como una casilla de verificacin, hay que aadir nuestra propia CheckBox control. El Habilitado propiedad est establecida enfalso , por lo que es de slo lectura, y el CheckBox 's Chequeado propiedad est vinculado al valor de lasinterrumpidas campo de datos. Con el ItemTemplate completa, la informacin del producto se muestra de una manera mucho ms fluida. Comparar elDetailsView salida del tutorial anterior (Figura 3) con la salida generada por el FormView en este tutorial (Figura 4).

Figura 3. La salida DetailsView rgida

Figura 4. El lquido de salida FormView (Clic en la foto para una imagen ms grande)

Conclusin
Mientras que el GridView y DetailsView controles pueden tener su salida personalizados utilizando TemplateFields , ambos todava presentar sus datos en una cuadrcula, en formato cuadrado. Para esos momentos en un solo registro tiene que ser demostrado con un formato menos rgido, el FormView es una opcin ideal. Al igual que el DetailsView , el FormView representa un nico registro de su origen de datos , pero, a diferencia del DetailsView , se compone slo de las plantillas y no soporta campos. Como hemos visto en este tutorial, el FormView permite un diseo ms flexible al mostrar un nico registro. En futuros tutoriales, vamos a examinar el DataList y el repetidor de controles, que proporcionan el mismo nivel de flexibilidad como el FormsView , pero son capaces de mostrar varios registros (como el GridView ).

Edicin, insercin y eliminacin de datos

Tutorial 16: Una visin general de Actualizar, insertar y borrar datos


Scott Mitchell

03 2007 Resumen: En este tutorial, Scott Mitchell explica cmo asignar el Insert () , Update () y Delete () los mtodos de laObjectDataSource a los mtodos de las clases en el BLL, as como la forma de configurar el GridView , DetailsView yFormView controles para proporcionar capacidades de modificacin de datos. (45 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 16 (Visual C #) Introduccin Paso 1: Creacin de la insercin, actualizacin y eliminacin Tutoriales Pginas Web Paso 2: Agregar y configurar el control ObjectDataSource examinando el ObjectDataSource marcado Paso 3: Agregar un control web de datos y configuracin que para la modificacin de datos Eliminacin de datos del GridView edicin de datos con GridView Insertar, editar y eliminar datos con los DetailsView Uso del FormView para un sistema ms flexible de datos Modificacin de la interfaz de usuario Conclusin

Introduccin
A travs de los tutoriales de varios aos, hemos examinado cmo mostrar los datos en una pgina ASP.NET usando elGridView , DetailsView y FormView controles. Estos controles slo trabajar con los datos que se suministra a los mismos. Por lo general, estos controles de acceso de datos a travs del uso de un control de origen de datos, tales como el ObjectDataSource . Hemos visto cmo el ObjectDataSource acta como un proxy entre la pgina de ASP.NET y los datos subyacentes. Cuando un GridView debe mostrar los datos, se invoca el Select () el mtodo de suObjectDataSource , que a su vez llama a un mtodo de nuestra lgica de negocio Layer (BLL), que llama a un mtodo en el que es apropiado la capa de acceso a datos (DAL) TableAdapter, que a su vez enva un SELECT de la consulta a la base de datos Northwind. Recordemos que cuando creamos el TableAdapters en el DAL en nuestro primer tutorial , Microsoft Visual Studio agrega automticamente mtodos para insertar, actualizar y eliminar datos de la tabla de base de datos subyacente.Por otra parte, en la creacin de una capa de lgica de negocios , hemos diseado los mtodos de la BLL que llam a estos mtodos de modificacin de datos DAL. Adems de su Seleccin () mtodo, el ObjectDataSource tambin tiene Insert () , Update () y Delete () mtodos. Al igual que el Select () mtodo, estos tres mtodos se pueden asignar a los mtodos de un objeto subyacente. Cuando se configura para insertar, actualizar o eliminar datos, el GridView , DetailsView y FormView controles proporcionan una interfaz de usuario para modificar los datos subyacentes. Esta interfaz de usuario llama al Insert () , Update () yDelete () los mtodos de la ObjectDataSource , que luego llamar a los mtodos asociados del objeto subyacente (ver Figura 1).

Figura 1. El insert (), Update () y Eliminar () de la ObjectDataSource servir como una aproximacin a la BLL. (Clic en la foto para una imagen ms grande.) En este tutorial, vamos a ver cmo asignar las Insert () , Update () y Delete () los mtodos de la ObjectDataSource a los mtodos de las clases en el BLL, as como la forma de configurar el GridView , DetailsView y FormView controles para proporcionar capacidades de modificacin de datos.

Paso 1: Creacin de la insercin, actualizacin y eliminacin de pginas Web Tutoriales


Antes de empezar a explorar la manera de insertar, actualizar y eliminar datos, primero tome un momento para crear las pginas ASP.NET en nuestro proyecto de sitio Web que vamos a necesitar para este tutorial y los siguientes.Empezar por agregar una nueva carpeta llamada EditInsertDelete. A continuacin, agregue las siguientes pginas ASP.NET a esa carpeta, asegurndose de asociar cada pgina con la pgina maestra Site.master:

Default.aspx Basics.aspx DataModificationEvents.aspx ErrorHandling.aspx UIValidation.aspx CustomizedUI.aspx OptimisticConcurrency.aspx ConfirmationOnDelete.aspx UserLevelAccess.aspx

Figura 2. Agregar las pginas ASP.NET para la modificacin de datos relacionados con tutoriales. Al igual que en las otras carpetas, Default.aspx en la carpeta EditInsertDelete mostrar una lista de los tutoriales en su seccin. Hay que recordar que el control de usuario SectionLevelTutorialListing.ascx proporciona esta funcionalidad. Por lo tanto, aadir este control de usuario para Default.aspx arrastrndolo desde el Explorador de soluciones a la vista Diseo de la pgina.

Figura 3. Agregar el control de usuario SectionLevelTutorialListing.ascx a Default.aspx. (Clic en la foto para una imagen ms grande.) Por ltimo, aadir las pginas como entradas al archivo Web.sitemap. En concreto, agregue el marcado siguiente despus de que el formato personalizado <siteMapNode> :
<Ttulo siteMapNode = "Editar, insertar y eliminar" url = "~ / EditInsertDelete / Default.aspx" description = "Ejemplos de informes que proporcionan edicin, insercin, y eliminacin de las capacidades ">

<SiteMapNode url = "~ / EditInsertDelete / Basics.aspx" title = "Conceptos bsicos" description = "examina los fundamentos de la modificacin de datos con la Controles GridView, DetailsView y FormView. "/> <SiteMapNode url = "~ / EditInsertDelete / DataModificationEvents.aspx" title = "Datos de eventos de modificacin" description = "explora los eventos provocados por el ObjectDataSource pertinentes a la modificacin de datos. "/> <SiteMapNode url = "~ / EditInsertDelete / ErrorHandling.aspx" title = "Control de errores" description = "Aprenda a manejar con gracia las excepciones planteadas

durante el flujo de trabajo de modificacin de datos. "/> <SiteMapNode url = "~ / EditInsertDelete / UIValidation.aspx" title = "Agregar validacin de entrada de datos" description = "Ayuda a prevenir la entrada de datos, errores, proporcionando validacin. "/> <SiteMapNode url = "~ / EditInsertDelete / CustomizedUI.aspx" title = "Personalizacin de la interfaz de usuario" description = "Personalizar el usuario de edicin e insercin de interfaces. "/> <SiteMapNode url = "~ / EditInsertDelete / OptimisticConcurrency.aspx" title = "concurrencia optimista" description = "Aprenda cmo ayudar a evitar que los usuarios simultneos de overwritting los cambios respectivos. "/> <SiteMapNode url = "~ / EditInsertDelete / ConfirmationOnDelete.aspx" title = "Confirmar en Delete" description = "Pedir al usuario la confirmacin al eliminar un registro. "/> <SiteMapNode url = "~ / EditInsertDelete / UserLevelAccess.aspx" title = "Capacidad de lmite basado en el usuario" description = "Aprenda a limitar la funcionalidad de modificacin de datos basado en el rol de usuario o los permisos. "> / </ SiteMapNode>

Despus de actualizar Web.sitemap, tome un momento para ver el sitio Web de tutoriales a travs de un navegador. El men de la izquierda ahora incluye artculos de la edicin, insercin y eliminacin de tutoras, como se muestra en la Figura 4.

Figura 4. El mapa del sitio incluye ahora entradas para la edicin, insercin y eliminacin de tutoriales.

Paso 2: Agregar y configurar el control ObjectDataSource


Debido a que el GridView , DetailsView y FormView difieren en su capacidad de modificacin de datos y el diseo, vamos a examinar uno por uno. En lugar de tener cada uno su propio control del uso de ObjectDataSource , sin embargo, vamos a crear un nico ObjectDataSource que los tres ejemplos de control se puede compartir. Abra la pgina Basics.aspx, arrastre un ObjectDataSource desde el Cuadro de herramientas hasta el Diseador, y haga clic en el Configurar origen de datos de enlace de la etiqueta inteligente. Debido a que el ProductsBLL es la nica clase de plomo en sangre que proporciona la edicin, insercin y eliminacin de los mtodos, configurar elObjectDataSource para utilizar esta clase.

Figura 5. Configurar el ObjectDataSource se utiliza la clase ProductsBLL. (Clic en la foto para una imagen ms grande.) En la siguiente pantalla se puede especificar qu mtodos de la ProductsBLL clase se asignan a la Seleccin () , Insert () , Update () y Delete () los mtodos de la ObjectDataSource mediante la seleccin de la ficha correspondiente y elegir el mtodo de la gota- la lista desplegable. Figura 6, que debe parecer familiar por ahora, los mapas Seleccione () el mtodo de la ObjectDataSource a la GetProducts () el mtodo de la ProductsBLL clase. El Insert () , Update () yDelete () mtodos se pueden configurar mediante la seleccin de la ficha correspondiente de la lista en la parte superior.

Figura 6. Tienen el ObjectDataSource devolver todos los productos. (Clic en la foto para una imagen ms grande.) Las figuras 7, 8 y 9 muestran la ACTUALIZACIN , INSERTAR y BORRAR las pestaas, respectivamente, de laObjectDataSource . Configurar estas fichas, por lo que el Insert () , Update () y Delete () mtodos de invocacin de laUpdateProduct , AddProduct y DeleteProduct mtodos, respectivamente, de la ProductsBLL clase.

Figura 7. Mapa del ObjectDataSource mtodo update () con el mtodo de la clase UpdateProduct ProductsBLL es.(Clic en la foto para una imagen ms grande.)

Figura 8. Mapa del ObjectDataSource Insert () para el mtodo AddProduct la clase de ProductsBLL. (Clic en la foto para una imagen ms grande.)

Figura 9. Mapa del ObjectDataSource Eliminar () para el mtodo DeleteProduct la clase de ProductsBLL. (Clic en la foto para una imagen ms grande.)

Usted puede haber notado que las listas desplegables en la ACTUALIZACIN , INSERTAR y BORRAR las fichas ya tiene estos mtodos seleccionados. Esto es gracias a nuestro uso de la DataObjectMethodAttribute , que decora los mtodos de ProductsBLL . Por ejemplo, el DeleteProduct mtodo tiene la siguiente firma:
[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Delete, true)] pblica DeleteProduct bool (int ProductID) { ... }

El DataObjectMethodAttribute atributo indica el propsito de cada mtodo, ya sea para seleccionar, insertar, actualizar o eliminar, y si es o no es el valor predeterminado. Si se omite estos atributos al crear clases BLL, tendr que seleccionar manualmente los mtodos de la ACTUALIZACIN , INSERTAR y BORRAR las fichas. Despus de asegurarse de que se tomen las ProductsBLL mtodos se asignan a la insercin () , Update () y Delete ()los mtodos de la ObjectDataSource , haga clic en Finalizar para completar el asistente.

Examinar el marcado ObjectDataSource


Despus de configurar el ObjectDataSource a travs de su asistente, vaya a la vista de cdigo fuente para examinar el marcado generado declarativa. El <asp:ObjectDataSource> etiqueta especifica el objeto subyacente y los mtodos de invocacin para. Adems, hay DeleteParameters , UpdateParameters y InsertParameters que se asignan a los parmetros de entrada para el AddProduct , UpdateProduct y DeleteProduct mtodos de la ProductsBLL clase:
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" DeleteMethod = "DeleteProduct" InsertMethod = "AddProduct" OldValuesParameterFormatString = "original_ {0}" SelectMethod = "GetProducts" TypeName = "ProductsBLL" UpdateMethod = "UpdateProduct"> <DeleteParameters> <asp:Parameter Name="productID" Type="Int32" /> </ DeleteParameters> <UpdateParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="supplierID" Type="Int32" />

<asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="quantityPerUnit" tipo="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="unitsInStock" Type="Int16" /> <asp:Parameter Name="unitsOnOrder" Type="Int16" /> <asp:Parameter Name="reorderLevel" Type="Int16" /> <asp:Parameter Name="discontinued" Type="Boolean" /> <asp:Parameter Name="productID" Type="Int32" /> </ UpdateParameters> <InsertParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="supplierID" Type="Int32" /> <asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="quantityPerUnit" tipo="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="unitsInStock" Type="Int16" /> <asp:Parameter Name="unitsOnOrder" Type="Int16" /> <asp:Parameter Name="reorderLevel" Type="Int16" /> <asp:Parameter Name="discontinued" Type="Boolean" /> </ InsertParameters> </ Asp: ObjectDataSource>

El ObjectDataSource incluye un parmetro para cada uno de los parmetros de entrada para sus mtodos asociados, as como una lista de SelectParameters est presente cuando el ObjectDataSource se configura para llamar a un mtodo de seleccin que espera un parmetro de entrada (como GetProductsByCategoryID ( IdCategora ) ). Como veremos en breve, los valores de estos DeleteParameters , UpdateParameters y InsertParameters se ajustan automticamente por el GridView , DetailsView y FormView , antes de invocar el Insert () , Update () o Eliminar () el mtodo de la ObjectDataSource . Estos valores tambin se pueden establecer mediante programacin, segn sea necesario, como veremos en un tutorial en el futuro. Un efecto secundario de utilizar el asistente para configurar a ObjectDataSource es que Visual Studio establece lapropiedad OldValuesParameterFormatString a original_ {0} . Este valor de la propiedad se utiliza para incluir los valores originales de los datos que se est editando y es til en dos situaciones:

Si, durante la edicin de un registro, los usuarios pueden cambiar el valor de clave principal. En este caso, tanto el nuevo valor de clave principal y el valor original de la clave principal debe ser siempre, por lo que el registro con el valor de clave principal original se puede encontrar y tener su valor actualizado en consecuencia. Cuando se utiliza la concurrencia optimista. Concurrencia optimista es una tcnica para asegurarse de que dos usuarios simultneos no sobrescribir los cambios respectivos, y es el tema para un tutorial en el futuro.

El OldValuesParameterFormatString propiedad indica el nombre de los parmetros de entrada en la actualizacin del objeto subyacente y eliminar los mtodos para los valores originales. Hablaremos de esta propiedad y su propsito con mayor detalle cuando se explora la simultaneidad optimista. Lo menciono ahora, sin embargo, porque nuestros mtodos de plomo en sangre no esperan que los valores originales, y por lo tanto es importante que eliminemos esta propiedad. Saliendo de la OldValuesParameterFormatString propiedad establecida en otra cosa que el valor por defecto ( {0} ) se producir un error cuando un control de datos de la Web intenta invocar el Update () o Eliminar () el mtodo de la ObjectDataSource , porque el ObjectDataSource tratar de pasar en ambas la UpdateParameters oDeleteParameters especificados, as como los parmetros de valor original. Si esto no es muy clara en este momento, no se preocupe, vamos a examinar esta propiedad y su utilidad en un tutorial futuro. Por ahora, slo asegrese de eliminar ya sea esta declaracin de propiedad por completo de la sintaxis declarativa o establecer el valor en el valor por defecto ( {0} ). Nota Si usted acaba de limpiar el OldValuesParameterFormatString valor de la propiedad desde la ventana Propiedades de la vista de diseo, la propiedad seguir existiendo en la sintaxis declarativa, sino que se define como una cadena vaca. Esto, lamentablemente, todava se traducir en el mismo problema que discutimos anteriormente. Por lo tanto, ya sea quitar la propiedad por completo de la sintaxis declarativa o, desde la ventana Propiedades, establezca el valor por defecto, {0} .

Paso 3: Agregar un control web de datos y configuracin que para la modificacin de datos
Despus de que el ObjectDataSource se ha aadido a la pgina y configurado, estamos listos para agregar controles de datos a la pgina Web, tanto para mostrar los datos y proporcionar un medio para el usuario final para modificarlo.Vamos a ver en el GridView , DetailsView y FormView por separado, ya que estos controles web de datos difieren en su capacidad de modificacin de datos y la configuracin. Como veremos en el resto de este artculo, la adicin de una edicin muy bsica, insercin y eliminacin de apoyo a travs del GridView , DetailsView y FormView controles es realmente tan fcil como comprobar un par de casillas de verificacin. Hay muchos matices y casos extremos en el mundo real que hacen de proporcionar dicha funcionalidad ms complicado que simplemente apuntar y hacer clic. En este tutorial, sin embargo, se centra exclusivamente en demostrar simple modificacin de datos capacidades. Tutoriales futuro estudie los problemas que sin duda surgirn en un ambiente del mundo real.

Borrado de datos de la GridView


Inicio arrastrando un GridView del cuadro de herramientas hasta el diseador. A continuacin, enlazar elObjectDataSource al GridView mediante la seleccin de la lista desplegable en el GridView tag 's inteligente. En este punto, el GridView marcado 's declarativo ser el siguiente:
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: BoundField DataField = "ProductID" HeaderText = "ProductID" InsertVisible = "false" ReadOnly = "True" SortExpression = "ProductID" /> <Asp: BoundField DataField = "ProductName" HeaderText = "ProductName" SortExpression = "ProductName" /> <Asp: BoundField DataField = "IdProveedor" HeaderText = "IdProveedor" SortExpression = "IdProveedor" /> <Asp: BoundField DataField = "CategoryID" HeaderText = "CategoryID" SortExpression = "CategoryID" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "CantidadPorUnidad" SortExpression = "CantidadPorUnidad" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "UnitPrice" SortExpression = "UnitPrice" /> <Asp: BoundField DataField = "UnitsInStock" HeaderText = "UnitsInStock" SortExpression = "UnitsInStock" /> <Asp: BoundField DataField = "UnitsOnOrder" HeaderText = "UnitsOnOrder" SortExpression = "UnitsOnOrder" /> <Asp: BoundField DataField = "ReorderLevel" HeaderText = "ReorderLevel" SortExpression = "ReorderLevel" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "CategoryName" ReadOnly = "True"

SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "SupplierName" ReadOnly = "True" SortExpression = "SupplierName" /> </ Columns> </ Asp: GridView>

Enlazar el GridView a la ObjectDataSource a travs de su etiqueta inteligente tiene dos ventajas:

BoundField s y CheckBoxField s se crean automticamente para cada uno de los campos que es devuelta por elObjectDataSource . Por otra parte, el BoundField y CheckBoxField propiedades 's se establecen basndose en los metadatos del campo subyacente. Por ejemplo, el ProductID , CategoryName y SupplierName campos estn marcados como de slo lectura en el ProductsDataTable y, por tanto, no debe ser actualizable durante la edicin. Para solucionar esto, la propiedades ReadOnly de estos BoundField s se establecen en verdad . La propiedad DataKeyNames se asigna al campo de clave principal (s) del objeto subyacente. Esto es esencial cuando se utiliza el GridView para editar o eliminar datos, ya que esta propiedad indica que el campo (o conjunto de campos) que identifica de forma nica cada registro. Para ms informacin sobre el DataKeyNamespropiedad, se refieren de nuevo a la maestro / detalle utilizando un GridView maestro seleccionable con un DetailView Detalles tutorial.

Mientras que el GridView se puede enlazar a los ObjectDataSource a travs de la ventana Propiedades o sintaxis declarativa, esto requiere que usted agregue la adecuada BoundField y DataKeyNames marcado de forma manual. El GridView control proporciona soporte integrado para la edicin a nivel de fila y eliminacin. Configuracin de unGridView para apoyar la eliminacin agrega una columna de eliminar los botones. Cuando el usuario hace clic en elEliminar botn para una fila determinada, sobreviene una devolucin de datos y el GridView realiza los siguientes pasos:
1. El DeleteParameters valor (s) del ObjectDataSource se les asigna. 2. La Eliminar () el mtodo de la ObjectDataSource se invoca, borrar el registro

especificado. 3. El GridView se vuelve a enlazar con el ObjectDataSource invocando su Select () mtodo. Los valores que se asignan a la DeleteParameters son los valores de la DataKeyNames campo (s) de la fila cuyoEliminar botn se hizo clic. Por lo tanto, es vital que el DataKeyNames propiedad de un GridView est correctamente configurada. Si se trata de falta, el DeleteParameters se le asignar un valor de null en el paso 1, que a su vez no resultar en ningn registro eliminado en el paso 2.

Nota El DataKeys coleccin se almacena en el estado de control del GridView , lo que significa que elDataKeys valores sern recordados a travs de devolucin de datos incluso si el estado de vista de laGridView se ha desactivado. Sin embargo, es muy importante que el estado de vista siguen siendo habilitado para GridView s que el apoyo de editar o borrar (el comportamiento por defecto). Si se establece la EnableViewState propiedad del GridView al falso , el comportamiento de editar y eliminar no tendrn ningn problema para un solo usuario, pero, si hay usuarios al mismo tiempo la eliminacin de datos, existe la posibilidad de que estos usuarios al mismo tiempo por accidente podra eliminar o modificar los registros que no tenan la intencin de eliminar o editar. (Ver la entrada de mi blog,ADVERTENCIA: punto de concurrencia con ASP.NET 2.0 GridViews / DetailsView / FormViews que la edicin de apoyo y / o eliminar y cuyo punto de vista del Estado es reducida ., para ms informacin) Esta misma advertencia se aplica tambin a DetailsView s y FormView s. Para agregar las capacidades de borrar a un GridView , basta con ir a la etiqueta inteligente y comprobar el Habilitar eliminacin casilla de verificacin.

Figura 10. Compruebe la Habilitar eliminacin casilla de verificacin. Comprobacin de la Habilitar eliminacin casilla de verificacin de la etiqueta inteligente aade un CommandField a la GridView . El CommandField hace una columna en el GridView con botones para realizar una o ms de las siguientes tareas: la seleccin de un registro, edicin de un registro, eliminar un registro. Anteriormente hemos visto laCommandField en la accin con la seleccin de registros en el maestro / detalle utilizando un GridView maestro seleccionable con un DetailView Detalles tutorial. El CommandField contiene una serie de ShowXButton propiedades que indican lo que una serie de botones que aparecen en el CommandField . Al marcar la Habilitar eliminacin casilla de verificacin, un CommandField cuyaShowDeleteButton propiedad se establece en cierto ha sido aadido a la columnas de la coleccin de GridView .
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"

DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <asp:CommandField ShowDeleteButton="True" /> ... BoundFields eliminado debido a la brevedad ... </ Columns> </ Asp: GridView>

En este punto, lo creas o no, hemos terminado con la adicin de soporte para la eliminacin de GridView ! Como muestra la Figura 11 se muestra, al visitar esta pgina a travs de un navegador, una columna de eliminar los botones est presente.

Figura 11. El CommandField agrega una columna de botones Eliminar. (Clic en la foto para una imagen ms grande.) Si usted ha sido la construccin de este tutorial desde el principio por su propia cuenta, cuando se prueba esta pgina, haga clic en el Eliminar botn se producir una excepcin. Contine leyendo para aprender acerca de por qu estas excepciones se plantearon y cmo solucionarlos. Nota Si va a seguir utilizando a lo largo de la descarga que acompaa a este tutorial, estos problemas ya han sido contabilizados. Sin embargo, os animo a leer a travs de los detalles que siguen para ayudar a identificar problemas que puedan surgir, as como soluciones adecuadas. Si, al intentar eliminar un producto, se obtiene una excepcin cuyo mensaje es similar a "ObjectDataSource 'ObjectDataSource1' no pudo encontrar un mtodo no genrico"

DeleteProduct "que tiene parmetros: ProductID, original_ProductID," es probable que se olvid de quitar el OldValuesParameterFormatString propiedad delObjectDataSource . Con la OldValuesParameterFormatString propiedad especificada, el ObjectDataSource intenta pasar tanto productID y original_ProductID parmetros de entrada a la DeleteProduct mtodo. DeleteProduct , sin embargo, slo acepta un solo parmetro de entrada, por lo tanto, la excepcin. Extraccin de laOldValuesParameterFormatString propiedad (o si se establece en {0} ) instruye a los ObjectDataSource no intentar pasar en el parmetro de entrada original.

Figura 12. Asegrese de que la propiedad OldValuesParameterFormatString se ha eliminado. (Clic en la foto para una imagen ms grande.) Incluso si se haba quitado la OldValuesParameterFormatString propiedad, usted seguir recibiendo una excepcin al intentar eliminar un producto, con el mensaje "La instruccin DELETE en conflicto con 'FK_Order_Details_Products" la restriccin de referencia. " La base de datos Neptuno contiene una restriccin de clave externa entre los detalles del pedido y Productos tablas, lo que significa que un producto no puede ser eliminado del sistema si hay uno o ms registros de que en la Orden Detalles mesa. Debido a que cada producto en la base de datos Neptuno tiene al menos un registro de detalles del pedido , no se puede eliminar ningn producto hasta que se elimine primero la asociada detalles para los registros del producto.

Figura 13. Una restriccin de clave fornea se prohbe la eliminacin de los productos. (Clic en la foto para una imagen ms grande.) Para nuestro tutorial, vamos a eliminar todos los registros de la Orden Detalles de la tabla. En una aplicacin real, tendramos la opcin de:

Tiene otra pantalla para administrar la informacin para los detalles. Aumentar la DeleteProduct mtodo para incluir lgica para eliminar los detalles del pedido del producto especificado. Modificar la consulta SQL que se utiliza por el TableAdapter que incluir la eliminacin de los detalles del pedido del producto especificado.

Vamos a eliminar todos los registros de la Orden Detalles de mesa para eludir la restriccin de clave fornea. Vaya al Explorador de servidores en Visual Studio, haga clic en el northwnd.mdf nodo y seleccione Nueva consulta . Luego, en la ventana de consulta, ejecute la siguiente instruccin: DELETE FROM [Order Details]

Figura 14. Eliminar todos los registros de la tabla Detalles de pedidos. (Clic en la foto para una imagen ms grande.) Despus de la limpieza de los Detalles de pedidos de mesa, haciendo clic en el Eliminar botn elimina el producto sin error. Si al hacer clic en el Eliminar botn, no se elimina el producto, asegrese de que el DataKeyNames propiedad del GridView se establece en el campo de clave principal ( ProductID ). Nota Al hacer clic en el Eliminar botn, sobreviene una devolucin de datos y el registro se elimina.Esto puede ser peligroso, porque es fcil de hacer clic en la fila equivocada de eliminar el botn accidentalmente. En un futuro tutorial, vamos a ver cmo agregar una confirmacin del lado del cliente al eliminar un registro.

La edicin de datos con el GridView


Junto con la eliminacin, el GridView control tambin proporciona soporte integrado de edicin de nivel de fila.Configuracin de un GridView para apoyar la edicin agrega una columna de editar los botones. Desde la perspectiva del usuario final, haga clic en una fila Editar botn hace que la fila que se pueden editar, convertir las clulas en cuadros de texto que contienen los valores existentes y la sustitucin de la edicin con el botn Actualizar y Cancelar botones.Despus de hacer los cambios deseados, los usuarios pueden hacer clic en el Actualizar botn para confirmar los cambios o Cancelar botn para deshacerse de ellos. En cualquier caso, despus de hacer clic actualizacin o Cancelar, el GridView vuelve a su estado pre-edicin. Desde nuestra perspectiva como desarrollador de pginas, cuando el usuario hace clic en el Editar botn para una fila determinada, sobreviene una devolucin de datos y el GridView realiza los siguientes pasos:
1. El EditItemIndex propiedad del GridView se asigna al ndice de la fila

cuyos Editar botn se hizo clic.

2. El GridView se vuelve a enlazar con el ObjectDataSource invocando su Select

() mtodo. 3. El ndice de la fila que coincide con el EditItemIndex se representa en "modo de edicin." En este modo, laedicin se sustituye por el botn Actualizar y Cancelar botones y BoundField s cuya ReadOnly propiedades se establecen en falso (por defecto) se representan como TextBox controles Web cuyo texto propiedades se asignan a los valores de los campos de datos. En este punto, el marcado se devuelve al navegador, permitiendo al usuario final para hacer cualquier cambio a los datos de la fila. Cuando el usuario hace clic en la actualizacin de botn, se produce una devolucin de datos y elGridView realiza los siguientes pasos:
1. El UpdateParameters valor (s) del ObjectDataSource se asignan los valores

introducidos por el usuario final en el GridView 's interfaz de edicin.


2. El Update () el mtodo de la ObjectDataSource se invoca, la actualizacin del

registro especificado.
3. El GridView se vuelve a enlazar con el ObjectDataSource invocando su Select

() mtodo. Los valores de clave principal que fueron asignados a la UpdateParameters en el paso 1 provienen de los valores que se especifican en el DataKeyNames propiedad, mientras que los valores clave no primarios provienen del texto en elTextBox controles Web de la fila editada. Al igual que con la eliminacin, es vital que el DataKeyNames propiedad de un GridView est correctamente configurada. Si se trata de falta, el UpdateParameters valor de clave principal se le asignar un valor de null en el paso 1, que a su vez no resultar en ningn registro actualizado en el paso 2. Edicin de la funcionalidad se puede activar con slo el control de la edicin Activar casilla de verificacin en elGridView tag 's inteligente.

Figura 15. Compruebe la Habilitar edicin casilla de verificacin.

Comprobacin de la Habilitar edicin casilla de verificacin Agregar una CommandField (si es necesario) y establecer su ShowEditButton propiedad verdadera . Como vimos anteriormente, el CommandField contiene una serie deShowXButton propiedades que indican lo que una serie de botones que aparecen en el CommandField .Comprobacin de la Habilitar edicin casilla aade la ShowEditButton propiedad a los actuales CommandField .
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: CommandField ShowDeleteButton = "True" ShowEditButton = "true" /> ... BoundFields eliminado debido a la brevedad ... </ Columns> </ Asp: GridView>

Eso es todo lo que hay que aadir soporte para la edicin rudimentaria. Como Figure16 muestra, la interfaz de edicin es bastante crudo, cada BoundField cuya ReadOnly propiedad est establecida en falso (por defecto) se representa como un cuadro de texto . Esto incluye reas como CategoryID y IdProveedor , que son claves para las otras tablas.

Figura 16. Al hacer clic en el botn Editar Chai muestra la fila de "modo de edicin." (Clic en la foto para una imagen ms grande.) Adems de pedir a los usuarios editar los valores de la clave externa directa, la interfaz de la interfaz de edicin es que carecen de las siguientes maneras:

Si el usuario introduce un CategoryID o IdProveedor que no existe en la base de datos, la ACTUALIZACIN va a violar una restriccin de clave externa, haciendo una excepcin a elevarse. La interfaz de edicin no incluye ningn tipo de validacin. Si usted no proporciona un valor determinado (comoProductName ) o introducir un valor de cadena en la que se espera un valor numrico (por ejemplo, introduciendo "Demasiado" en

el PrecioUnidad cuadro de texto), una excepcin ser lanzada. Un tutorial futuro se examinar cmo agregar controles de validacin para la interfaz de usuario de edicin. En la actualidad, todos los campos de productos que no son de slo lectura debe ser incluido en el GridView . Si tuviramos que quitar un campo de la GridView -por ejemplo, PrecioUnidad , al actualizar los datos, elGridView no se establecera la UpdateParameters valor de Precio por unidad , lo que cambiara el registro de la base de PrecioUnidad a un NULL el valor. Del mismo modo, si un campo obligatorio, como ProductName , se elimina de la GridView , la actualizacin fallar con la misma "columna" ProductName "no permite nulos" excepcin mencionada anteriormente. El formato de edicin de la interfaz deja mucho que desear. El Precio por unidad se muestra con cuatro decimales. Idealmente, el CategoryID y IdProveedor los valores que contienen DropDownList s que la lista de categoras y proveedores en el sistema.

Estas son todas las deficiencias que vamos a tener que vivir con, por ahora, pero que se abordarn en futuros tutoriales.

Insertar, editar y eliminar datos con los DetailsView


Como hemos visto en los primeros tutoriales, el DetailsView muestra un registro de control a la vez y, al igual que elGridView , permite editar y borrar del registro que se muestra actualmente. Tanto la experiencia del usuario final con la edicin y eliminacin de elementos de un DetailsView y el flujo de trabajo desde el lado de ASP.NET son idnticos a los de la GridView . Cuando el DetailsView difiere del GridView es que tambin proporciona un sistema integrado de insertar apoyo. Para demostrar las capacidades de modificacin de datos del GridView , empezar por la adicin de un DetailsView a la pgina de Basics.aspx por encima de la existente GridView y enlazarlo a la existente ObjectDataSource a travs delDetailsView tag 's inteligente. A continuacin, limpiar la altura y el ancho de las propiedades de la DetailsView , y comprobar la paginacin Habilitar la opcin de la etiqueta inteligente. Para habilitar la edicin, insercin y eliminacin de apoyo, simplemente marque la edicin Activar , Habilitar insercin y Habilitar eliminacin casillas de verificacin de la etiqueta inteligente.

Figura 17. Configurar el DetailsView para apoyar la edicin, insercin y eliminacin. Al igual que con el GridView , la adicin de la edicin, insercin o eliminacin de apoyo aade un CommandField a laDetailsView , como la sintaxis declarativa siguiente muestra:
<Asp: DetailsView ID = "DetailsView1" runat = "server" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True"> <Fields> <Asp: BoundField DataField = "ProductID" HeaderText = "ProductID" InsertVisible = "false" ReadOnly = "True" SortExpression = "ProductID" /> <Asp: BoundField DataField = "ProductName" HeaderText = "ProductName" SortExpression = "ProductName" /> <Asp: BoundField DataField = "IdProveedor" HeaderText = "IdProveedor" SortExpression = "IdProveedor" /> <Asp: BoundField DataField = "CategoryID" HeaderText = "CategoryID" SortExpression = "CategoryID" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "CantidadPorUnidad" SortExpression = "CantidadPorUnidad" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "UnitPrice" SortExpression = "UnitPrice" />

<Asp: BoundField DataField = "UnitsInStock" HeaderText = "UnitsInStock" SortExpression = "UnitsInStock" /> <Asp: BoundField DataField = "UnitsOnOrder" HeaderText = "UnitsOnOrder" SortExpression = "UnitsOnOrder" /> <Asp: BoundField DataField = "ReorderLevel" HeaderText = "ReorderLevel" SortExpression = "ReorderLevel" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "CategoryName" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "SupplierName" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: CommandField ShowDeleteButton = "True" ShowEditButton = "True" ShowInsertButton = "true" /> </ Campos> </ Asp: DetailsView>

Tenga en cuenta que para el DetailsView , el CommandField aparece al final de la Columnas coleccin por defecto.Debido a que el DetailsView campos 's se representan como filas, el CommandField aparece como una fila conInsertar , editar y eliminar los botones en la parte inferior de la DetailsView .

Figura 18. Configurar el DetailsView para apoyar la edicin, insercin y eliminacin. (Clic en la foto para una imagen ms grande.) Al hacer clic en el Eliminar botn se inicia la misma secuencia de eventos como con el GridView : una devolucin de datos, seguido por el DetailsView que pueblan el DeleteParameters de su ObjectDataSource , basado en elDataKeyNames valores y concluy con un llamado a la eliminacin () el mtodo de su ObjectDataSource , que en realidad elimina el producto de la base de datos. Edicin en el DetailsView tambin trabaja de una manera que es idntica a la del GridView . Para insertar, el usuario final se presenta con un nuevo botn que, cuando se hace clic, hace que el DetailsView en "modo de insercin". Con el "modo de insercin", el nuevo botn se sustituye por insercin y Cancelar botones, y slo aquellos BoundField s cuya InsertVisible propiedad est establecida en verdadero (por defecto) que se muestran son.Los campos de datos que se identifican como los campos de incremento automtico, como por ejemplo ProductID , tienen su propiedad InsertVisible establecido en falso cuando se enlaza el DetailsView a la fuente de datos a travs de la etiqueta inteligente. Al enlazar un origen de datos a un DetailsView a travs de la etiqueta inteligente, Visual Studio establece elInsertVisible propiedad falsos slo para los campos de incremento automtico. Campos de slo lectura, comoCategoryName y SupplierName , se mostrar en la interfaz de "modo de insercin" del usuario, a menos que suInsertVisible propiedad se establece explcitamente en falso . Tome un momento para establecer el InsertVisiblepropiedades de estos dos campos de falsa , ya sea a travs de la DetailsView sintaxis 's declarativa o mediante laedicin Campos enlace en la etiqueta

inteligente. La figura 19 muestra la configuracin de la InsertVisible propiedadesfalsas haciendo clic en el Editar campos enlace.

Figura 19. Neptuno ofrece ahora t Acme. (Clic en la foto para una imagen ms grande.) Despus de ajustar la InsertVisible propiedades, ver la pgina Basics.aspx en un navegador y haga clic en el nuevobotn. La figura 20 muestra el DetailsView cuando se agrega una nueva bebida-Acme t a nuestra lnea de productos.

Figura 20. Neptuno ofrece ahora t Acme. (Clic en la foto para una imagen ms grande.) Despus de entrar en los detalles para el t Acme y haga clic en el Insertar botn, sobreviene una devolucin de datos y el nuevo registro se aade a los productos de la tabla de base de datos. Debido a que este DetailsView muestra los productos en el orden en que aparecen en la tabla de base de datos, debemos pgina para el ltimo producto con el fin de ver el nuevo producto.

Figura 21. Detalles para el t Acme (Clic en la foto para una imagen ms grande) Nota La propiedad CurrentMode del DetailsView indica que la interfaz que se muestra y puede ser uno de los siguientes valores: Editar , Insertar , o ReadOnly . La propiedad DefaultMode indica el modo en que el DetailsView vuelve despus de una edicin o insercin se ha completado y es til para mostrar unDetailsView que est permanentemente en la edicin o el modo de insercin. El punto y haga clic en la insercin y edicin de la DetailsView sufren las mismas limitaciones que el GridView : El usuario debe introducir existentes CategoryID y IdProveedor valores a travs de un cuadro de texto, la interfaz no tiene ninguna lgica de validacin, todos los campos de productos, que no permiten NULL los valores o no tienen un valor por defecto especificado en el nivel de base de datos deben ser incluidos en la interfaz de la insercin, y as sucesivamente. Las tcnicas que vamos a examinar para la ampliacin y mejora de la GridView interfaz 's edicin en futuros artculos se pueden aplicar tambin a la DetailsView interfaces de control de edicin e insercin.

Utilizando el FormView para una interfaz de usuario ms flexible modificacin de datos


El FormView ofrece soporte integrado para insertar, editar y eliminar los datos, pero, debido a que utiliza las plantillas en lugar de campos, no hay lugar para aadir la BoundField s o CommandField que es utilizado por el GridView yDetailsView controles para proporcionar los datos de modificacin de la interfaz. En cambio, esta interfaz, los controles Web para recopilar la entrada del usuario

cuando se aade un nuevo artculo o editar uno ya existente, junto con elNuevo , Editar , Borrar , Insertar , Actualizar y Cancelar botones, se debe agregar manualmente las plantillas adecuadas. Afortunadamente, Visual Studio crea automticamente la interfaz necesaria cuando se enlaza el FormView a una fuente de datos a travs de la lista desplegable en la etiqueta inteligente. Para ilustrar estas tcnicas, empezar por la adicin de un FormView a la pgina de Basics.aspx y, desde el FormViewtag 's inteligente, que se unen a los ya creados ObjectDataSource . Esto generar un EditItemTemplate ,InsertItemTemplate y ItemTemplate para el FormView , con TextBox controles Web para recopilar la entrada del usuario y el botn de control web para la Nueva , Editar , Borrar , Insertar , Actualizar y Cancelar botones. Adems, elDataKeyNames propiedad del FormView se establece en el campo de clave principal ( ProductID ) del objeto que es devuelto por el ObjectDataSource . Por ltimo, compruebe la paginacin Habilitar opcin en el FormView tag 's inteligente. La sintaxis siguiente muestra el marcado declarativo para el ItemTemplate del FormView , despus de que elFormView se ha unido a la ObjectDataSource . Por defecto, cada campo de valor no-booleano producto se une a ladel texto de propiedad de una etiqueta de control Web, mientras que cada campo valor booleano ( descatalogados ) se une a la Chequeado propiedad de una persona discapacitada CheckBox control Web. Para que el Nuevo , Editar yEliminar botones para activar ciertos FormView comportamiento cuando se hace clic, es imperativo que suCommandName valores se establece en Nueva , Editar y Eliminar , respectivamente.
<Asp: FormView ID = "FormView1" runat = "server" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True"> <EditItemTemplate> ... </ EditItemTemplate> <InsertItemTemplate> ... </ InsertItemTemplate> <ItemTemplate> ProductID: <Asp: Label = ID "ProductIDLabel" runat = "server" Texto ='<%# Eval ("ProductID") %>'></ asp: Label> <br /> ProductName: <Asp: Label = ID "ProductNameLabel" runat = "server" Texto ='<%# Bind ("ProductName")%> '> </ Asp: Label> <br />

IdProveedor: <Asp: Label = ID "SupplierIDLabel" runat = "server" Texto ='<%# Bind ("IdProveedor")%> '> </ Asp: Label> <br /> CategoryID: <Asp: Label = ID "CategoryIDLabel" runat = "server" Texto ='<%# Bind ("CategoryID")%> '> </ Asp: Label> <br /> CantidadPorUnidad: <Asp: Label = ID "QuantityPerUnitLabel" runat = "server" Texto ='<%# Bind ("CantidadPorUnidad")%> '> </ Asp: Label> <br /> Precio por unidad: <Asp: Label = ID "UnitPriceLabel" runat = "server" Texto ='<%# Bind ("Precio por unidad") %>'></ asp: Label> <br /> UnitsInStock: <Asp: Label = ID "UnitsInStockLabel" runat = "server" Texto ='<%# Bind ("UnitsInStock")%> '> </ Asp: Label> <br /> UnitsOnOrder: <Asp: Label = ID "UnitsOnOrderLabel" runat = "server" Texto ='<%# Bind ("UnitsOnOrder")%> '> </ Asp: Label> <br /> ReorderLevel: <Asp: Label = ID "ReorderLevelLabel" runat = "server" Texto ='<%# Bind ("ReorderLevel")%> '> </ Asp: Label> <br /> Discontinuadas: <Asp: CheckBox ID = "DiscontinuedCheckBox" runat = "server" Comprobar ='<%# Bind ("interrumpidas")%> ' Enabled = "false" /> <br /> CategoryName:

<Asp: Label = ID "CategoryNameLabel" runat = "server" Texto ='<%# Bind ("NombreCategora")%> '> </ Asp: Label> <br /> SupplierName: <Asp: Label = ID "SupplierNameLabel" runat = "server" Texto ='<%# Bind ("SupplierName")%> '> </ Asp: Label> <br /> <Asp: LinkButton ID = "editbutton" runat = "server" CausesValidation = "False" CommandName = "Editar" Text = "Editar"> </ Asp: LinkButton> <Asp: LinkButton ID = "DeleteButton" runat = "server" CausesValidation = "False" CommandName = "Delete" Text = "Eliminar"> </ Asp: LinkButton> <Asp: LinkButton ID = "NewButton" runat = "server" CausesValidation = "False" CommandName = "Nuevo" Text = "Nuevo"> </ Asp: LinkButton> </ ItemTemplate> </ Asp: FormView>

La figura 22 muestra el ItemTemplate del FormView cuando se ve a travs de un navegador. Cada campo est en la lista de productos con el Nuevo , Editar y Eliminar botones en la parte inferior.

Figura 22. El valor predeterminado ItemTemplate FormView muestra cada campo del producto, junto con la creacin, edicin y Eliminar. (Clic en la foto para una imagen ms grande.) Al igual que con el GridView y DetailsView , haga clic en el Eliminar botn, o cualquier botn , LinkButton oImageButton que CommandName propiedad est establecida en Eliminar , provoca una devolucin de datos, llena elDeleteParameters del ObjectDataSource , basado en el DataKeyNames valor del FormView , e invoca el Delete () el mtodo de la ObjectDataSource . Cuando la edicin se pulsa el botn, sobreviene una devolucin de datos y los datos de rebote a la EditItemTemplate, que es el encargado de mostrar la interfaz de edicin. Esta interfaz incluye los controles Web para la edicin de datos, junto con la actualizacin y Cancelar botones. El valor predeterminado EditItemTemplate que es generado por Visual Studio contiene una etiqueta para los campos de incremento automtico ( ProductID ), un cuadro de texto para cada campo de valor no-booleano, y un CheckBox para cada campo valor booleano. Este comportamiento es muy similar a la de la auto-generados BoundField s en el GridView y DetailsView controles. Nota Un pequeo problema con el FormView 's de auto-generacin de la EditItemTemplate es que hace TextBox controles Web para aquellos campos que son de slo lectura, como CategoryName ySupplierName . Vamos a ver cmo dar cuenta de esto en breve. El TextBox controles en el EditItemTemplate tienen su texto la propiedad compartida con el valor de su campo de datos correspondiente mediante el uso de dos vas de enlace de datos . De dos vas de enlace de datos, denotada por <% # Enlace ("dataField")%> -lleva a cabo el enlace de datos tanto en el momento del enlace de datos a la plantilla y al

rellenar el ObjectDataSource parmetros 's para insertar o modificar registros. Es decir, cuando el usuario hace clic en el Editar botn de la ItemTemplate , el Bind () mtodo devuelve el campo de datos especificado de valores. Despus de que el usuario ha realizado cambios y los clics de actualizacin , los valores expuestos de nuevo que corresponden a los campos de datos se especifica mediante el uso de Bind () se aplican a la UpdateParameters deObjectDataSource . Por otra parte, una va de enlace de datos, denotada por <% # Eval ("dataField")%> de slo recupera los valores de los campos de datos en el enlace de datos a la plantilla y que no devuelven los valores introducidos por el usuario a los parmetros de la fuente de datos sobre devolucin de datos. El marcado declarativo siguiente muestra la EditItemTemplate del FormView . Tenga en cuenta que el Bind () mtodo se utiliza en la sintaxis de enlace de datos aqu, y que la actualizacin y Cancelar Botn de controles Web tienen suCommandName propiedades con la misma.
<Asp: FormView ID = "FormView1" runat = "server" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True"> <EditItemTemplate> ProductID: <Asp: Label = ID "ProductIDLabel1" runat = "server" Texto ="<%# Eval ("ProductID") %>"></ asp: Label> <br /> ProductName: <Asp: TextBox ID = "ProductNameTextBox" runat = "server" Texto ="<%# Bind ("ProductName")%> "> </ Asp: TextBox> <br /> IdProveedor: <Asp: TextBox ID = "SupplierIDTextBox" runat = "server" Texto ="<%# Bind ("IdProveedor")%> "> </ Asp: TextBox> <br /> CategoryID: <Asp: TextBox ID = "CategoryIDTextBox" runat = "server" Texto ="<%# Bind ("CategoryID")%> "> </ Asp: TextBox> <br /> CantidadPorUnidad: <Asp: TextBox ID = "QuantityPerUnitTextBox" runat = "server" Texto ="<%# Bind ("CantidadPorUnidad")%> "> </ Asp: TextBox> <br /> Precio por unidad:

<Asp: TextBox ID = "UnitPriceTextBox" runat = "server" Texto ="<%# Bind ("Precio por unidad")%> "> </ Asp: TextBox> <br /> UnitsInStock: <Asp: TextBox ID = "UnitsInStockTextBox" runat = "server" Texto ="<%# Bind ("UnitsInStock")%> "> </ Asp: TextBox> <br /> UnitsOnOrder: <Asp: TextBox ID = "UnitsOnOrderTextBox" runat = "server" Texto ="<%# Bind ("UnitsOnOrder")%> "> </ Asp: TextBox> <br /> ReorderLevel: <Asp: TextBox ID = "ReorderLevelTextBox" runat = "server" Texto ="<%# Bind ("ReorderLevel")%> "> </ Asp: TextBox> <br /> Discontinuadas: <Asp: CheckBox ID = "DiscontinuedCheckBox" runat = "server" Comprobar ="<%# Bind ("interrumpidas")%> "/> <br /> CategoryName: <Asp: TextBox ID = "CategoryNameTextBox" runat = "server" Texto ="<%# Bind ("NombreCategora")%> "> </ Asp: TextBox> <br /> SupplierName: <Asp: TextBox ID = "SupplierNameTextBox" runat = "server" Texto ="<%# Bind ("SupplierName")%> "> </ Asp: TextBox> <br /> <Asp: LinkButton ID = "UpdateButton" runat = "server" CausesValidation = "True" CommandName = "Actualizar" Text = "Update"> </ Asp: LinkButton> <Asp: LinkButton ID = "UpdateCancelButton" runat = "server"

CausesValidation = "False" CommandName = "Cancelar" Text = "Cancelar"> </ Asp: LinkButton> </ EditItemTemplate> <InsertItemTemplate> ... </ InsertItemTemplate> <ItemTemplate> ... </ ItemTemplate> </ Asp: FormView>

En este punto, nuestra EditItemTemplate har una excepcin que se produce si se intenta usarlo. El problema es que elCategoryName y SupplierName campos se representan como TextBox controles Web en el EditItemTemplate . O debemos cambiar estos TextBox es de etiqueta s o eliminarlos por completo. Vamos a eliminarlos por completo de laEditItemTemplate . La figura 23 muestra el FormView en el navegador despus de la edicin se ha hecho clic en el botn de Chai. Tenga en cuenta que la SupplierName y CategoryName campos que se muestran en el ItemTemplate ya no estn presentes, como acabamos de sacarlos del EditItemTemplate . Cuando la actualizacin se hace clic en el FormView procede a travs de la misma secuencia de pasos como el GridView y DetailsView controles.

Figura 23. Por defecto, el EditItemTemplate muestra cada campo editable del producto como un cuadro de texto o casilla de verificacin. (Clic en la foto para una imagen ms grande.) Cuando el Insertar botn que se encuentra dentro del ItemTemplate del FormView se hace clic en una devolucin de datos se produce. Sin embargo, no hay datos se une a la FormView , porque un nuevo registro que se agrega. ElInsertItemTemplate interfaz incluye los controles Web para agregar un nuevo registro, junto con la insercin yCancelar botones. El valor predeterminado InsertItemTemplate que es generado por Visual Studio contiene un cuadro de texto para cada campo de valor nobooleano y un CheckBox para cada campo de valor booleano, similar a la generada automticamente EditItemTemplate interfaz 's. Cada cuadro de texto de control tiene su texto la propiedad compartida con el valor de su campo de datos correspondiente a travs de dos vas de enlace de datos. El marcado declarativo siguiente muestra la InsertItemTemplate del FormView . Tenga en cuenta que el Bind ()mtodo se utiliza en la sintaxis de enlace de datos aqu, y que la insercin y Cancelar Botn de controles Web tienen suCommandName propiedades con la misma.
<Asp: FormView ID = "FormView1" runat = "server" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" AllowPaging = "True"> <EditItemTemplate> ... </ EditItemTemplate> <InsertItemTemplate> ProductName: <Asp: TextBox ID = "ProductNameTextBox" runat = "server" Texto ="<%# Bind ("ProductName")%> "> </ Asp: TextBox> <br /> IdProveedor: <Asp: TextBox ID = "SupplierIDTextBox" runat = "server" Texto ="<%# Bind ("IdProveedor")%> "> </ Asp: TextBox> <br /> CategoryID: <Asp: TextBox ID = "CategoryIDTextBox" runat = "server" Texto ="<%# Bind ("CategoryID")%> "> </ Asp: TextBox> <br /> CantidadPorUnidad: <Asp: TextBox ID = "QuantityPerUnitTextBox" runat = "server"

Texto ="<%# Bind ("CantidadPorUnidad")%> "> </ Asp: TextBox> <br /> Precio por unidad: <Asp: TextBox ID = "UnitPriceTextBox" runat = "server" Texto ="<%# Bind ("Precio por unidad")%> "> </ Asp: TextBox> <br /> UnitsInStock: <Asp: TextBox ID = "UnitsInStockTextBox" runat = "server" Texto ="<%# Bind ("UnitsInStock")%> "> </ Asp: TextBox> <br /> UnitsOnOrder: <Asp: TextBox ID = "UnitsOnOrderTextBox" runat = "server" Texto ="<%# Bind ("UnitsOnOrder")%> "> </ Asp: TextBox> <br /> ReorderLevel: <Asp: TextBox ID = "ReorderLevelTextBox" runat = "server" Texto ="<%# Bind ("ReorderLevel")%> "> </ Asp: TextBox> <br /> Discontinuadas: <Asp: CheckBox ID = "DiscontinuedCheckBox" runat = "server" Comprobar ="<%# Bind ("interrumpidas")%> "/> <br /> CategoryName: <Asp: TextBox ID = "CategoryNameTextBox" runat = "server" Texto ="<%# Bind ("NombreCategora")%> "> </ Asp: TextBox> <br /> SupplierName: <Asp: TextBox ID = "SupplierNameTextBox" runat = "server" Texto ="<%# Bind ("SupplierName")%> "> </ Asp: TextBox> <br /> <Asp: LinkButton ID = "InsertButton" runat = "server" CausesValidation = "True" CommandName = "Insertar"

Text = "Insertar"> </ Asp: LinkButton> <Asp: LinkButton ID = "InsertCancelButton" runat = "server" CausesValidation = "False" CommandName = "Cancelar" Text = "Cancelar"> </ Asp: LinkButton> </ InsertItemTemplate> <ItemTemplate> ... </ ItemTemplate> </ Asp: FormView>

Hay una sutileza con la FormView 's de auto-generacin de la InsertItemTemplate . En concreto, el TextBox controles Web se crean, incluso para aquellos campos que son de slo lectura, como CategoryName y SupplierName . Al igual que con el EditItemTemplate , que se deben eliminar estos TextBox es de la InsertItemTemplate . La figura 24 muestra el FormView en un navegador cuando se aade un nuevo producto, caf Acme. Tenga en cuenta que la SupplierName y CategoryName campos que se muestran en el ItemTemplate ya no estn presentes, como acabamos de conseguir su eliminacin. Cuando el Insertar botn es pulsado, el FormView procede a travs de la misma secuencia de pasos que el DetailsView control, agregar un nuevo registro a la Productos de mesa. La figura 25 muestra los detalles del producto Caf de Acme en el FormView despus de que se ha insertado.

Figura 24. El InsertItemTemplate dicta la interfaz de insertar el FormView. (Clic en la foto para una imagen ms grande.)

Figura 25. Los detalles del nuevo producto, caf Acme, se muestran en el FormView. (Clic en la foto para una imagen ms grande.) Separando las de slo lectura, la edicin y la insercin de las interfaces en tres modelos distintos, el FormView permite un grado de control sobre estas interfaces que el DetailsView y GridView . Nota Al igual que el DetailsView , el CurrentMode propiedad del FormView indica que la interfaz que se muestra, y su DefaultMode propiedad indica el modo en que el FormView vuelve despus de una edicin o insercin se ha completado.

Conclusin
En este tutorial, hemos examinado los fundamentos de la insercin, edicin y eliminacin de datos mediante el GridView, DetailsView y FormView . Los tres de estos controles proporcionan un cierto nivel de capacidades integradas de modificacin de datos que pueden ser utilizados sin necesidad de escribir una sola lnea de cdigo en la pgina ASP.NET, gracias a los controles web de datos y el ObjectDataSource . Sin embargo, el simple punto y haga clic en las tcnicas de hacer un muy dbil e ingenuo modificacin de datos de interfaz de usuario. Con el fin de proporcionar la validacin, inyectar valores

programticos, manejar excepciones con gracia, personalizar la interfaz de usuario, y as sucesivamente, vamos a tener que depender de un grupo de tcnicas que se discutir sobre los tutoriales siguientes.

Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin de
Scott Mitchell 03 2007 Resumen: Ampliar el incorporado en la insercin, actualizacin y eliminacin de las capacidades de datos de ASP.NET Controles Web y personalizar la interfaz de edicin para actualizar slo un subconjunto de los campos de productos, con este tutorial de Scott Mitchell. (29 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 17 (Visual C #) Introduccin Paso 1: Actualizacin ProductName de un producto y los campos PrecioUnidad Mejorar el formato PrecioUnidad Paso 2: Prohibir UnitPrices NULL Paso 3: proporcionan una interfaz para aadir nuevos productos Paso 4: Asignacin de valores a los parmetros de CategoryID y IdProveedor Conclusin

Introduccin
Cuando se utiliza el incorporado en la insercin, edicin o eliminacin de las caractersticas del GridView , DetailsViewo FormView controles, una serie de medidas transpirar cuando el usuario final se completa el proceso de agregar un nuevo registro o actualizacin o eliminacin de un registro existente. Como ya comentamos en el tutorial anterior , cuando una fila se edita en el GridView la edicin se sustituye por el botn de actualizacin y Cancelar botones y laBoundField a su vez s en TextBox es. Despus de que el usuario final se actualizan los datos y los clics de actualizacin , los siguientes pasos se llevan a cabo la devolucin de datos:
1. El GridView rellena el UpdateParameters de su ObjectDataSource con un

campo nico que identifica el registro modificado (s) del (a travs de la DataKeyNames propiedad), junto con los valores introducidos por el usuario. 2. El GridView invoca el Update () como su mtodo de ObjectDataSource , que a su vez invoca el mtodo apropiado en el objeto subyacente ( ProductsDAL.UpdateProduct , en nuestro tutorial anterior).

3. Los datos subyacentes, que ahora incluye los cambios se actualizan, es de rebote a

la GridView . Durante esta secuencia de pasos, una serie de eventos de fuego, lo que nos permite crear controladores de eventos para agregar lgica personalizada, cuando sea necesario. Por ejemplo, antes del paso 1, el RowUpdating caso de que el GridView incendios. Podemos, en este momento, cancelar la solicitud de actualizacin si hay algn error de validacin. Cuando el Update () es llamado, la actualizacin caso de ObjectDataSource incendios, proporcionando una oportunidad para aadir o modificar los valores de cualquiera de los UpdateParameter s. Despus de que el mtodo del objeto subyacente de la ObjectDataSource ha completado su ejecucin, la actualizacin caso deObjectDataSource se eleva. Un controlador de eventos para la actualizacin evento puede inspeccionar los detalles sobre la operacin de actualizacin, tales como nmero de filas que se vieron afectados y si existe o no una excepcin.Finalmente, despus del paso 2, el RowUpdated caso de que el GridView incendios, un controlador de eventos de este evento puede examinar la informacin adicional sobre la operacin de actualizacin que se realiz justo. La Figura 1 muestra esta serie de eventos y los pasos cuando se actualiza un GridView . El patrn de eventos en la Figura 1 no es aplicable slo a la actualizacin con un GridView . Insertar, actualizar o borrar datos del GridView ,DetailsView o FormView precipita la misma secuencia de eventos pre y post-grado de nivel tanto para el control de los datos y la Web ObjectDataSource .

Figura 1. Una serie de eventos de incendios pre-grado y post grado, al actualizar los datos en un GridView. (Clic en la foto para una imagen ms grande.)

En este tutorial, vamos a examinar con estos eventos para ampliar la incorporada en la insercin, actualizacin y eliminacin de funciones de los controles Web ASP.NET de datos. Tambin veremos cmo personalizar la interfaz de edicin para actualizar slo un subconjunto de los campos de productos.

Paso 1: Actualizacin ProductName de un producto y los campos PrecioUnidad


En las interfaces de edicin del tutorial anterior, todos los campos de producto que no eran de slo lectura tienen que ser incluidos. Si tuviramos que quitar un campo de la GridView -por ejemplo, CantidadPorUnidad -al actualizar los datos, el control web de datos no se establecera la ObjectDataSource 's CantidadPorUnidad UpdateParameters valor.El ObjectDataS ource luego pasara en un NULL el valor en el UpdateProduct mtodo de la capa de lgica de negocio (BLL), que iba a cambiar el registro de bases de datos editados de CantidadPorUnidad columna a un NULL el valor. Del mismo modo, si un campo tan necesario como ProductName , se elimina de la interfaz de edicin, la actualizacin fallar con un 'ProductName' columna no permite valores nulos excepcin. La razn de este comportamiento es que el ObjectDataSource se configura para llamar la UpdateProduct mtodo de la ProductsBLL clase, que espera un parmetro de entrada para cada uno de los campos de productos. Por lo tanto, la UpdateParameters coleccin de laObjectDataSource contiene un parmetro para cada uno de los parmetros de entrada del mtodo. Si queremos ofrecer un control web de datos que permite al usuario final para actualizar slo un subconjunto de los campos, entonces debemos ya sea mediante programacin la falta UpdateParameters los valores de la actualizacin de controlador de eventos de la ObjectDataSource o crear y llamar a un mtodo que slo espera BLL un subconjunto de los campos. Vamos a explorar este ltimo enfoque. En concreto, vamos a crear una pgina que muestra slo el ProductName y PrecioUnidad campos editables en unGridView . La interfaz de edicin de este GridView permite al usuario actualizar slo los dos campos que se muestran,ProductName y PrecioUnidad . Debido a que esta interfaz de edicin slo se proporciona un subconjunto de los campos de un producto, hay que crear ya sea un ObjectDataSource que utiliza el UpdateProduct mtodo de la actual BLL y tiene el valor de los productos que faltan campo establecerse mediante programacin con la actualizacin decontrolador de eventos o un nuevo mtodo de plomo en sangre que slo espera el subconjunto de los campos definidos en el GridView . Para este tutorial, vamos a usar esta ltima opcin y crear una sobrecarga de laUpdateProduct mtodo-uno que lleva en tan slo tres parmetros de entrada: productName , precioUnitario yproductID .
[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Update, false)] pblica UpdateProduct bool (cadena productName, decimal? precioUnitario, int productID) {

Northwind.ProductsDataTable productos = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false;

Northwind.ProductsRow producto = productos [0];

product.ProductName = productName; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value;

/ / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto);

/ / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; }

Al igual que con el original UpdateProduct mtodo, esta sobrecarga se inicia mediante la comprobacin para ver si hay un producto en la base de datos que ha especificado el ProductID . Si no, devuelve falso , lo que indica que la solicitud para actualizar la informacin del producto fallado. De lo contrario, se actualiza el ProductName y PrecioUnidadcampos del registro de productos existentes de acuerdo y se compromete la actualizacin llamando al Update ()mtodo del TableAdapter, pasando los ProductsRow ejemplo. Con esta adicin a nuestra ProductsBLL clase, estamos listos para crear la simplificacin GridView interfaz. Abra el DataModificationEvents.aspx en la carpeta EditInsertDelete, y aadir un GridView a la pgina. Crear un nuevoObjectDataSource y configurarlo para usar el ProductsBLL clase, con su Seleccin () mtodo de asignacin deGetProducts y su actualizacin () mtodo de asignacin a la UpdateProduct sobrecarga que toma slo en losproductName , precioUnitario y productID parmetros de entrada. La Figura 2 muestra el Asistente para crear orgenes de datos para hacer el mapa de la actualizacin () el mtodo de la ObjectDataSource a la nuevaUpdateProduct sobrecarga del mtodo de la ProductsBLL clase.

Figura 2. Mapa del ObjectDataSource Update () para la sobrecarga UpdateProduct nuevo. (Clic en la foto para una imagen ms grande.) Debido a que nuestro ejemplo inicialmente slo tiene la capacidad de editar datos, pero no para insertar o borrar registros, tome un momento para indicar explcitamente que la insercin () y Delete () los mtodos de laObjectDataSource no debe ser asignada a cualquiera de los mtodos de la ProductsBLL clase, al ir a la INSERTAR yBORRAR las pestaas y elegir (Ninguno) en la lista desplegable.

Figura 3. Seleccionar (Ninguno) en la lista desplegable para el INSERT y DELETE pestaas. (Clic en la foto para una imagen ms grande.) Despus de completar este asistente, consulte la Habilitar edicin casilla de verificacin de la GridView tag 's inteligente. Con el Asistente para crear orgenes de datos y completar la unin a la GridView , Microsoft Visual Studio ha creado la sintaxis declarativa para ambos controles. Vaya a la vista de cdigo fuente para inspeccionar el marcado declarativo delObjectDataSource , que se muestra aqu:
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" OldValuesParameterFormatString = "original_ {0}" SelectMethod = "GetProducts" TypeName = "ProductsBLL" UpdateMethod = "UpdateProduct"> <UpdateParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="productID" Type="Int32" /> </ UpdateParameters> </ Asp: ObjectDataSource>

Porque no hay asignaciones para la insercin () y Delete () los mtodos de la ObjectDataSource , no hayInsertParameters o DeleteParameters secciones. Adems, debido a la actualizacin () mtodo se asigna a laUpdateProduct sobrecarga del mtodo que slo acepta tres parmetros de entrada, el UpdateParameters seccin tiene slo tres parmetros de los casos. Tenga en cuenta que la OldValuesParameterFormatString propiedad del ObjectDataSource se establece en original_ {0} . Esta propiedad se establece automticamente por Visual Studio cuando se utiliza el asistente Configurar origen de datos. Sin embargo, debido a nuestros mtodos de plomo en sangre no esperan que el original ProductID valor que se pasa en, eliminar esta asignacin de la propiedad por completo de la sintaxis declarativa de la ObjectDataSource . Nota Si usted acaba de limpiar el OldValuesParameterFormatString valor de la propiedad de laspropiedades de la ventana en la vista Diseo, la propiedad seguir existiendo en la sintaxis declarativa, sino que se define como una cadena vaca. Quite la propiedad por completo de la sintaxis declarativa o, en el Propiedades ventana, establezca el valor de la opcin predeterminada, que es {0} . Mientras que el ObjectDataSource slo ha UpdateParameters para el nombre del producto, precio, y la identificacin, Visual Studio ha aadido una BoundField o CheckBoxField en el GridView para cada uno de los campos de los productos.

Figura 4. El GridView contiene un BoundField o CheckBoxField para cada uno de los campos de los productos.(Clic en la foto para una imagen ms grande.) Cuando el usuario final edita un producto y haga clic en su actualizacin de botn, el GridView enumera los campos que no eran de slo lectura. A continuacin, establece el valor del parmetro correspondiente en el UpdateParameterscoleccin de la ObjectDataSource con el valor introducido por el usuario. Si no hay ningn parmetro correspondiente, el GridView agrega una a la coleccin. Por lo tanto, si nuestro GridView contiene BoundField s y CheckBoxField s para todos los campos del producto, el ObjectDataSource acabar invocando la UpdateProduct sobrecarga que toma en todos estos parmetros, a pesar de que el marcado declarativo del ObjectDataSource slo especifica tres parmetros de entrada (ver Figura 5). Del mismo modo, si existe alguna combinacin de los campos de productos no-de slo lectura en el GridView que no se corresponde con los parmetros de entrada para un UpdateProduct sobrecarga, una excepcin se produce cuando intenta actualizar.

Figura 5. El GridView aadir parmetros a la coleccin del ObjectDataSource UpdateParameters.

Para asegurarse de que el ObjectDataSource llama al UpdateProduct sobrecarga que toma en tan slo el nombre del producto, precio, y la identificacin, debemos restringir el GridView para que los campos editables por slo elProductName y PrecioUnidad . Esto puede lograrse mediante la eliminacin de la otra BoundField s y CheckBoxFields, mediante el establecimiento de los otros campos " ReadOnly propiedad real , o por alguna combinacin de los dos.Para este tutorial, vamos a eliminar todos los GridView los campos excepto el ProductName y PrecioUnidadBoundField s, despus de que el marcado declarativo del GridView se ver como la siguiente:
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <asp:CommandField ShowEditButton="True" /> <Asp: BoundField DataField = "ProductName" HeaderText = "ProductName" SortExpression = "ProductName" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "UnitPrice" SortExpression = "UnitPrice" /> </ Columns> </ Asp: GridView>

Aunque el UpdateProduct sobrecarga espera tres parmetros de entrada, slo tenemos dos BoundField s en nuestroGridView . Esto se debe a la productID parmetro de entrada es un valor de clave principal y pasa a travs del valor de la DataKeyNames propiedad de la fila editada. Nuestro GridView , junto con el UpdateProduct sobrecarga, permite al usuario editar slo el nombre y el precio de un producto sin perder ninguno de los campos de otros productos.

Figura 6. La interfaz permite la edicin de tan slo el nombre del producto y el precio. (Clic en la foto para una imagen ms grande.) Nota Como se explica en el tutorial anterior , es de vital importancia que el Vista del estado delGridView estar habilitado (el comportamiento por defecto). Si se establece la EnableViewState propiedad del GridView al falso , se corre el riesgo de tener usuarios concurrentes sin querer borrar o editar los registros. (Ver ADVERTENCIA: punto de concurrencia con ASP.NET 2.0 GridViews / DetailsView / FormViews que la edicin de apoyo y / o eliminar y cuyo punto de vista del Estado es reducida , para ms informacin.)

La mejora de la PrecioUnidad formato


Mientras que el GridView ejemplo que se muestra en la Figura 6 obras, el PrecioUnidad campo no tiene formato alguno, lo que resulta en un indicador de importe que carece de smbolos de moneda y cuenta con cuatro decimales.Para aplicar un formato de moneda para las filas no editable, establezca la DataFormatString propiedad de laPrecioUnidad BoundField a {0: c} y su HtmlEncode propiedad falsos .

Figura 7. Establecer DataFormatString UnitPrice y HtmlEncode propiedades en consecuencia. (Clic en la foto para una imagen ms grande.) Con este cambio, las filas no se puede editar el formato de precios como una moneda, la fila editada, sin embargo, sigue mostrando el valor sin el smbolo de moneda y con cuatro decimales.

Figura 8. Las filas no modificables son ahora el formato de moneda. (Clic en la foto para una imagen ms grande.)

Las instrucciones de formato especificado en el DataFormatString propiedad se puede aplicar a la interfaz de edicin mediante el establecimiento de la ApplyFormatInEditMode propiedad de la BoundField de verdad (el valor predeterminado es falso ). Tmese un momento para establecer esta propiedad en verdad .

Figura 9. Establezca la propiedad ApplyFormatInEditMode la BoundField PrecioUnidad en true. (Clic en la foto para una imagen ms grande.) Con este cambio, el valor de la PrecioUnidad que se muestra en la fila editada tambin tiene el formato de una moneda.

Figura 10. El valor de la fila editada de UnitPrice es ahora el formato de una moneda. (Clic en la foto para una imagen ms grande.) Sin embargo, la actualizacin de un producto con el smbolo de moneda en la caja de texto, tales como $ 19.00-lanza una FormatException . Cuando el GridView trata de asignar los valores suministrados por el usuario a laUpdateParameters coleccin del ObjectDataSource , no es capaz de convertir el PrecioUnidad cadena "$ 19.00" en eldecimal que es requerido por los parmetros (ver Figura 11). Para remediar esto, podemos crear un controlador de eventos para el RowUpdating caso de que el GridView y tienen que analice los suministrados por el usuarioPrecioUnidad como moneda en formato decimal . El RowUpdating caso de que el GridView acepta como segundo parmetro, un objeto de tipoGridViewUpdateEventArgs , que incluye un NewValues diccionario como una de sus propiedades que contiene los valores suministrados por el usuario que estn listos para ser asignado a la UpdateParameters coleccin delObjectDataSource . Podemos sobrescribir el archivo PrecioUnidad valor en el NewValues coleccin con un valor decimal que se analiza usando el formato de moneda con las siguientes lneas de cdigo en el RowUpdatingcontrolador de eventos:
protected void GridView1_RowUpdating (object sender, GridViewUpdateEventArgs e) { if (e.NewValues ["UnitPrice"]! = null) e.NewValues ["UnitPrice"] = Decimal.Parse (e.NewValues ["UnitPrice"]. ToString (), System.Globalization.NumberStyles.Currency); }

Si el usuario ha proporcionado una PrecioUnidad valor (como "$ 19.00"), este valor se sobrescribe con el valor decimal que se calcula Decimal.Parse , el anlisis del valor como moneda. Esto correctamente analizar el decimal en el caso de los smbolos de moneda, las comas, decimales, y as sucesivamente, y utiliza la enumeracin NumberStyles en elSystem.Globalization espacio de nombres. La figura 11 muestra tanto el problema que es causado por los smbolos de moneda en el suministrado por el usuarioPrecioUnidad y cmo el RowUpdating controlador de eventos del GridView puede ser utilizado para analizar la entrada tal correctamente.

Figura 11. El valor de la fila editada de UnitPrice es ahora el formato de una moneda. (Clic en la foto para una imagen ms grande.)

Paso 2: Prohibir UnitPrices NULL


Aunque la base de datos est configurado para permitir NULL los valores de la PrecioUnidad columna de la Productosde mesa, que puede ser que desee evitar que los usuarios que visitan esta pgina en particular de la especificacin de un NULL PrecioUnidad valor. Es decir, si un usuario no puede entrar en un PrecioUnidad valor de la hora de editar una fila de productos, en lugar de guardar los resultados en la base de datos se desea mostrar un mensaje que informa al usuario que, a travs de esta pgina, todos los productos editados debe tener un precio especificada. El GridViewUpdateEventArgs objeto que se pasa en el RowUpdating controlador de eventos del GridView contiene unCancelar propiedad que, si se establece en verdadero , termina el proceso de actualizacin. Vamos a ampliar

elRowUpdating controlador de eventos para establecer e.Cancel de verdad y mostrar un mensaje que explica por qu, si el Precio por unidad de valor en el NewValues coleccin es nula . Empezar por agregar una etiqueta de control Web a la pgina denominada MustProvideUnitPriceMessage . Estaetiqueta de control se mostrar si el usuario no especifica un PrecioUnidad valor de la actualizacin de un producto.Establecer el texto de propiedad de la etiqueta que debe ofrecer un precio para el producto . Tambin he creado una nueva clase de CSS en styles.css que es llamado de alerta y tiene la siguiente definicin:
. Advertencia { Color: Rojo; font-style: italic; font-weight: bold; font-size: x-large; }

Por ltimo, establezca el CssClass propiedad de la etiqueta de advertencia . En este punto, el diseador debe mostrar el mensaje de advertencia en rojo, negrita, cursiva tamao, tipo de letra extra grande por encima del GridView , como se muestra en la Figura 12.

Figura 12. Una etiqueta se ha aadido por encima del GridView. (Clic en la foto para una imagen ms grande.)

Por defecto, esta etiqueta debe estar oculto, as que ponga su Visible propiedad a falso en el Page_Load controlador de eventos:
protected void Page_Load (object sender, EventArgs e) { MustProvideUnitPriceMessage.Visible = false; }

Si el usuario intenta actualizar un producto sin especificar el Precio por unidad , queremos cancelar la actualizacin y mostrar la etiqueta de advertencia. Aumentar la RowUpdating controlador de eventos del GridView , de la siguiente manera:
protected void GridView1_RowUpdating (object sender, GridViewUpdateEventArgs e) { if (e.NewValues ["UnitPrice"]! = null) { e.NewValues ["UnitPrice"] = Decimal.Parse (e.NewValues ["UnitPrice"]. ToString (), System.Globalization.NumberStyles.Currency); } ms { / / Muestra la etiqueta MustProvideUnitPriceMessage.Visible = true;

/ / Cancelar la actualizacin e.Cancel = true; } }

Si un usuario intenta guardar un producto sin especificar el precio, la actualizacin se cancela y aparece un mensaje til es. Aunque la base de datos (y la lgica de negocio) para permitir NULL PrecioUnidad s, esta particular pgina ASP.NET no.

Figura 13. Un usuario no puede dejar en blanco Precio por unidad. (Clic en la foto para una imagen ms grande.) Hasta ahora, hemos visto cmo utilizar el RowUpdating caso de que el GridView para modificar mediante programacin los valores del parmetro asignado a la UpdateParameters coleccin del ObjectDataSource , as como la forma de cancelar el proceso de actualizacin completo. Estos conceptos llevan a la DetailsView y FormView y los controles se aplican tambin a insertar y borrar. Estas tareas tambin se puede hacer en el ObjectDataSource nivel a travs de controladores de eventos para suinsercin , actualizacin y eliminacin de los acontecimientos. Estos eventos se desencadenan antes de que el mtodo asociado del objeto de fondo es invocado, y proporcionan una oportunidad de ltima oportunidad para modificar la coleccin parmetros de entrada o cancelar la operacin por completo. Los controladores de eventos para estos tres eventos se les pasa un objeto de tipo ObjectDataSourceMethodEventArgs que tiene dos propiedades de inters:

Cancelar , el cual, si se establece en verdadero , cancela la operacin que se realiza InputParameters , que es la coleccin de InsertParameters , UpdateParameters , o DeleteParameters , dependiendo de si el controlador de eventos es para la insercin , actualizacin o eliminacin de eventos

Para ilustrar el trabajo con los valores de los parmetros en el ObjectDataSource nivel, vamos a incluir un DetailsViewen la pgina que permite a los usuarios aadir un nuevo producto. Este DetailsView se utiliza para proporcionar una interfaz para aadir un nuevo producto a la base de datos rpidamente. Para mantener una interfaz de usuario cuando se aade un nuevo producto, vamos a permitir que el usuario introduzca los valores de la ProductName yPrecioUnidad nicos campos. De manera predeterminada, los valores que no se suministran en la interfaz de la insercin de la DetailsView se establece en un NULL el valor base de datos. Sin embargo, podemos utilizar la insercin de caso de la ObjectDataSource para inyectar valores por defecto, como veremos en breve.

Paso 3: proporcionan una interfaz para aadir nuevos productos


Arrastre un DetailsView del cuadro de herramientas hasta el Diseador de encima de la GridView , retire su altura yancho de las propiedades, y se unen a la ObjectDataSource que ya est presente en la pgina. Esto agregar unaBoundField o CheckBoxField para cada uno de los campos de los productos. Porque queremos utilizar esteDetailsView para agregar nuevos productos, se debe checar la Habilitar insercin opcin de la etiqueta inteligente.Sin embargo, no hay tal opcin, ya que la insercin () el mtodo de la ObjectDataSource no est asignado a un mtodo en el ProductsBLL clase, recuerdo que nos planteamos esta asignacin a (Ninguno) al configurar la fuente de datos (ver Figura 3). Para configurar el ObjectDataSource , seleccione el Data Configurar origen de enlace desde su etiqueta inteligente, que pone en marcha el asistente. La primera pantalla le permite cambiar el objeto subyacente a que laObjectDataSource est obligado, dejarlo en ProductsBLL . La siguiente pantalla muestra las asignaciones de los mtodos de la ObjectDataSource a los del objeto subyacente. A pesar de que expresamente se indica que la insercin () y Delete () mtodos no deben asignarse a cualquiera de los mtodos, si vas a la INSERTAR y BORRAR las pestaas, vers que una aplicacin est ah. Esto se debe a la AddProduct y DeleteProduct mtodos de la ProductsBLL utilizar elDataObjectMethodAttribute atributo para indicar que son los mtodos por defecto para insertar () y Delete () , respectivamente. Por lo tanto, el ObjectDataSource asistente selecciona las mismas cada vez que se ejecuta el asistente, a menos que haya algn otro valor que se especifica explcitamente. Salir de la insercin () mtodo que apunta a la AddProduct mtodo, pero una vez ms establecer la lista desplegable de la DELETE ficha para (Ninguna) .

Figura 14. Establecer en la pestaa Insertar de la lista desplegable el mtodo AddProduct. (Clic en la foto para una imagen ms grande.)

Figura 15. Ajuste la lengeta de DELETE de la lista desplegable en (Ninguno). (Clic en la foto para una imagen ms grande.) Despus de haber realizado estos cambios, la sintaxis declarativa de la ObjectDataSource se ampliar para incluir unInsertParameters coleccin, como se muestra aqu:
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" SelectMethod = "GetProducts" TypeName = "ProductsBLL" UpdateMethod = "UpdateProduct" OnUpdating = "ObjectDataSource1_Updating" InsertMethod = "AddProduct" OldValuesParameterFormatString = "original_ {0}"> <UpdateParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="productID" Type="Int32" /> </ UpdateParameters> <InsertParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="supplierID" Type="Int32" />

<asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="quantityPerUnit" tipo="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="unitsInStock" Type="Int16" /> <asp:Parameter Name="unitsOnOrder" Type="Int16" /> <asp:Parameter Name="reorderLevel" Type="Int16" /> <asp:Parameter Name="discontinued" Type="Boolean" /> </ InsertParameters> </ Asp: ObjectDataSource>

Volver a ejecutar el asistente vuelve a aadir la OldValuesParameterFormatString propiedad. Tome un momento para aclarar esta propiedad o bien establecer el valor por defecto ( {0} ) o eliminarlo por completo de la sintaxis declarativa. Con el ObjectDataSource que proporciona capacidades de insercin, el DetailsView tag 's inteligente ahora incluir laHabilitar insercin casilla de verificacin; volver al Diseador y marque esta opcin. A continuacin, recortar elDetailsView , por lo que slo tiene dos BoundField s- ProductName y PrecioUnidad y la CommandField . En este punto, la sintaxis declarativa de la DetailsView debe tener el siguiente aspecto:
<Asp: DetailsView ID = "DetailsView1" runat = "server" AutoGenerateRows = "false" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <Fields> <Asp: BoundField DataField = "ProductName" HeaderText = "ProductName" SortExpression = "ProductName" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "UnitPrice" SortExpression = "UnitPrice" /> <asp:CommandField ShowInsertButton="True" /> </ Campos> </ Asp: DetailsView>

La figura 16 muestra esta pgina cuando se ve a travs de un navegador en este momento. Como puede ver, elDetailsView muestra el nombre y el precio del primer producto (Chai). Lo que queremos, sin embargo, es una interfaz de insercin que proporciona un medio para que el usuario agregue un nuevo producto a la base de datos rpidamente.

Figura 16. El DetailsView est representada, en modo de slo lectura. (Clic en la foto para una imagen ms grande.) Con el fin de mostrar el DetailsView en el modo de insertar, debemos establecer el DefaultMode propiedad deInsercin . Esto hace que el DetailsView en modo de insercin, cuando visit por primera vez, y lo mantiene all despus de insertar un nuevo registro. Como muestra la Figura 17 se muestra, como un DetailsView proporciona una interfaz rpida para agregar un nuevo registro.

Figura 17. El DetailsView proporciona una interfaz para aadir un nuevo producto rpidamente. (Clic en la foto para una imagen ms grande.) Cuando el usuario introduce el nombre del producto y el precio, como "El agua Acme" y "1,99", como en la figura 17 y haga clic en Insertar , sobreviene una devolucin de datos y el flujo de trabajo comienza la insercin, que culmina en un registro de nuevos productos se aaden a la base de datos. El DetailsView mantiene su interfaz de insercin y elGridView es automticamente rebote a su origen de datos con el fin de incluir el nuevo producto, como se muestra en la Figura 18.

Figura 18. El agua Acme producto ha sido aadido a la base de datos. Mientras que el GridView en la Figura 18 no lo demuestra, los campos de los productos que carecen de la DetailsViewinterfaz CategoryID , IdProveedor , CantidadPorUnidad , y as sucesivamente-se les asigna NULL los valores de base de datos. Esto se puede ver mediante la realizacin de los siguientes pasos: 1. Vaya al Explorador de servidores en Visual Studio. 2. Ampliar el northwnd.mdf nodo de base de datos. 3. Haga clic derecho en los productos de nodo de la tabla de base de datos. 4. Seleccione Mostrar datos de tabla . Este procedimiento mostrar una lista de todos los registros en los productos de mesa. Como muestra la Figura 19 se muestra, todas las columnas de nuestro producto, otros nuevos que ProductID , ProductName y PrecioUnidad hanNULL valores.

Figura 19. Los campos de los productos que no estn previstas en el DetailsView se les asignan valores NULL.(Clic en la foto para una imagen ms grande.) Podemos quiere dar un valor por defecto que no sea NULL para uno o ms de estos valores de la columna, ya sea porque NULL no es la mejor opcin por defecto o por la columna de la base de datos en s no permite NULL s. Para lograr esto, se puede establecer mediante programacin los valores de los parmetros de la InputParameterscoleccin de la DetailsView . Esta asignacin se puede hacer ya sea en el controlador de eventos para el ItemInsertingcaso de que el DetailsView o la Insercin caso de ObjectDataSource . Debido a que ya hemos visto en el uso de los eventos de pregrado y post-grado en el nivel de control de datos de la web, vamos a explorar esta vez usando elObjectDataSource eventos 's.

Paso 4: Asignacin de valores a los parmetros de CategoryID y IdProveedor


Para este tutorial, vamos a imaginar que para nuestra aplicacin, al aadir un nuevo producto a travs de esta interfaz, se debe asignar un CategoryID y IdProveedor valor de 1 . Como se mencion anteriormente, el ObjectDataSourcetiene un par de eventos de pre-grado y post-grado que el fuego durante el proceso de modificacin de datos. Cuando su insercin () es llamado, el ObjectDataSource primero eleva su insercin evento, llama al mtodo en que suinsercin () ha sido el mtodo asignado, y, finalmente, plantea la Insertado evento. La insercin de controlador de eventos nos da una ltima oportunidad para modificar los parmetros de entrada o cancelar la operacin por completo. Nota En una aplicacin real, es probable que desee ya sea para permitir a los usuarios especificar la categora y el proveedor o para recoger este valor para ellos, sobre la base de ciertos criterios o la lgica de negocio (en vez de seguir ciegamente la seleccin de un ID de uno ). En cualquier caso, el ejemplo muestra cmo establecer mediante programacin el valor de un parmetro de entrada del evento de pre-grado de la ObjectDataSource .

Tome un momento para crear un controlador de eventos para la Insercin caso de ObjectDataSource . Tenga en cuenta que los parmetros del controlador de eventos de la segunda entrada es un objeto de tipoObjectDataSourceMethodEventArgs , que tiene una propiedad para acceder a la coleccin de parmetros (InputParameters ) y una propiedad para cancelar la operacin ( Cancelar ).
protected void ObjectDataSource1_Inserting (Object sender, ObjectDataSourceMethodEventArgs e) {

En este punto, el InputParameters propiedad contiene el InsertParameters coleccin de la ObjectDataSource con los valores asignados desde el DetailsView . Para cambiar el valor de uno de estos parmetros, slo tiene que utilizare.InputParameters [" paramName "] = valor . Por lo tanto, para establecer el CategoryID y IdProveedor a los valores de 1 , ajustar la insercin de controlador de eventos para el siguiente aspecto:
protected void ObjectDataSource1_Inserting (Object sender, ObjectDataSourceMethodEventArgs e) { e.InputParameters ["CategoryID"] = 1; e.InputParameters ["IdProveedor"] = 1; }

Esta vez, al agregar un producto, tales como nuevos Acme Sodael CategoryID y IdProveedor columnas del nuevo producto se establecen en un (vase figura 20).

Figura 20. Nuevos productos ya tienen sus valores y CategoryID IdProveedor establece en 1. (Clic en la foto para una imagen ms grande.)

Conclusin
Durante la edicin, insercin y eliminacin de procesos, tanto en el control de los datos y la Web ObjectDataSourceproceder a travs de una serie de eventos de pre-grado y post grado. En este tutorial, se examinaron los eventos pre-nivel y vio cmo utilizar estas para personalizar los parmetros de entrada o cancelar la operacin de modificacin de datos en conjunto, tanto desde el control de datos y la Web ObjectDataSource eventos 's. En el siguiente tutorial, veremos cmo crear y utilizar controladores de eventos para los eventos de nivel post-.

Tutorial 18: Manejo de BLL-Level y excepciones DAL-Level en una pgina ASP.NET


Scott Mitchell 03 2007 Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) En este tutorial, vamos a ver cmo se muestra un mensaje amistoso, error informativo que una excepcin se producen durante una insercin, actualizacin o eliminacin de un control de Web ASP.NET de datos. Descargar el cdigo de la muestra . Contenido del Tutorial 18 (Visual C #) Introduccin Paso 1: Creacin de un GridView editable de Productos Paso 2: Manejo de Gracia DAL-Level excepciones Paso 3: Manejo de Gracia BLL-Level excepciones Conclusin

Introduccin
Trabajar con datos de una aplicacin web ASP.NET usando una arquitectura de aplicaciones por niveles implica los siguientes tres pasos generales: 1. Determinar qu mtodo de la capa de lgica de negocio debe ser invocado y lo valores de los parmetros a pasar. Los valores de los parmetros pueden ser

codificadas de forma rgida, programacin asignada, o de los insumos introducidos por el usuario. 2. Invocar el mtodo. 3. Procesar los resultados. Al llamar a un mtodo de plomo en sangre que devuelve datos, esto puede implicar la unin de datos para un control web de datos. Para los mtodos de plomo en sangre que modifican los datos, esto puede incluir la realizacin de alguna accin sobre la base de un valor de retorno o de gracia de manejar cualquier excepcin que se levant en el paso 2. Como vimos en el Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin , tanto en el ObjectDataSource y los controles Web de datos proporcionan puntos de extensibilidad para los pasos 1 y 3. El GridView , por ejemplo, dispara sus RowUpdating caso antes de asignar los valores de campo para suObjectDataSource 's UpdateParameters coleccin; su RowUpdated evento se produce despus de que elObjectDataSource ha completado la operacin. Ya hemos examinado los hechos que se desencadenan durante el paso 1 y he visto cmo se pueden utilizar para personalizar los parmetros de entrada o cancelar la operacin. En este tutorial, vamos a dirigir nuestra atencin a los eventos que se desencadenan despus de la operacin se ha completado. Con estos controladores de eventos de nivel postpodemos, entre otras cosas, determinar si se produjo una excepcin durante la operacin y manejar con gracia, mostrando un mensaje amistoso, error informativo en la pantalla en lugar de por defecto la pgina de excepcin estndar de ASP.NET. Para ilustrar el trabajo con estos eventos a nivel de post-, vamos a crear una pgina que muestra los productos en un editable GridView . Cuando se actualiza un producto, si se lanza una excepcin a nuestra pgina de ASP.NET mostrar un mensaje corto por encima de la GridView explicando que ha ocurrido un problema. Vamos a empezar!

Paso 1: Creacin de un GridView editable de Productos


En el tutorial anterior, hemos creado un editable GridView con slo dos campos: ProductName y PrecioUnidad . Esto requiere la creacin de una sobrecarga adicional para el ProductsBLL clase UpdateProduct mtodo, que slo se aceptan tres parmetros de entrada (el nombre del producto, precio unitario, y la ID) en lugar de un parmetro para cada campo del producto. Para este tutorial, vamos a practicar esta tcnica una vez ms, la creacin de un editableGridView que muestra el nombre del producto, cantidad por unidad, precio unitario, y las unidades en stock, pero slo permite que el nombre, precio unitario, y las unidades en stock para ser editado. Para adaptarse a este escenario, vamos a necesitar otra sobrecarga del UpdateProduct mtodo, que acepta cuatro parmetros: el nombre del producto, precio unitario, unidades en stock, y ID. Agregue el mtodo siguiente a laProductsBLL clase:
[System.ComponentModel.DataObjectMethodAttribute ( System.ComponentModel.DataObjectMethodType.Update, false)] pblica UpdateProduct bool (cadena productName, decimal? precioUnitario, corto? UnitsInStock, int ProductID)

Northwind.ProductsDataTable productos = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0]; product.ProductName = productName; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value; if (UnitsInStock == null) product.SetUnitsInStockNull (); ms product.UnitsInStock = unitsInStock.Value; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; }

Con este mtodo completo, estamos listos para crear la pgina ASP.NET que permite editar estos cuatro campos especficos del producto. Abra la pgina ErrorHandling.aspx en la carpeta EditInsertDelete y aadir un GridView a la pgina a travs del diseo. Obligar a la GridView a un nuevo ObjectDataSource , la cartografa de la Seleccin ()mtodo para la ProductsBLL clase GetProducts () y el mtodo Update () mtodo para la UpdateProduct sobrecarga acaba de crear.

Figura 1. Utilice la sobrecarga del mtodo UpdateProduct que acepta cuatro parmetros de entrada.

Esto crear un ObjectDataSource con un UpdateParameters coleccin con cuatro parmetros y un GridView con un campo para cada uno de los campos de productos. El ObjectDataSource marcado 's declarativa asigna elOldValuesParameterFormatString bienes cuyo valor original_ {0} , lo que provocar una excepcin, ya que nuestras clases BLL no esperan un parmetro de entrada denominado original_productID para pasar pulg No se olvide de quitar esta opcin del todo de la sintaxis declarativa (o se establece en el valor predeterminado, {0} ). A continuacin, recortar el GridView para incluir slo el ProductName , CantidadPorUnidad , PrecioUnidad yUnitsInStock BoundField s. T ambin se sienten en libertad de aplicar cualquier formato a nivel de campo que considere necesarias (tales como el cambio del HeaderText propiedades). En el tutorial anterior, vimos cmo dar formato a la PrecioUnidad BoundField como una moneda, tanto en modo de slo lectura y el modo de edicin. Vamos a hacer lo mismo aqu. Hay que recordar que esta opcin requiere laBoundField 's DataFormatString propiedad {0: c} , su HtmlEncode propiedad falsa , y su ApplyFormatInEditModede verdad , como se muestra en la Figura 2.

Figura 2. Configurar el BoundField PrecioUnidad a mostrar como una moneda. Formateo de la PrecioUnidad como moneda en la interfaz de edicin es necesario crear un controlador de eventos para el GridView 's RowUpdating caso que se analiza la moneda con formato de cadena en un decimal valor.Recordemos que el RowUpdating controlador de eventos del ltimo tutorial tambin se controla para asegurar que el usuario ha proporcionado un PrecioUnidad valor. Sin embargo, para este tutorial, vamos a permitir que el usuario omite el precio.

GridView1_RowUpdating protected void (object sender, GridViewUpdateEventArgs e) { if (e.NewValues ["UnitPrice"]! = null) e.NewValues ["UnitPrice"] = Decimal.Parse (e.NewValues ["UnitPrice"]. ToString (), System.Globalization.NumberStyles.Currency); }

Nuestro GridView incluye un CantidadPorUnidad BoundField , pero esto BoundField debe ser para fines de presentacin y no debe ser editable por el usuario. Para arreglar esto, basta con establecer la BoundField s ' ReadOnlypropiedad real .

Figura 3. Hacer que el BoundField CantidadPorUnidad de slo lectura. Por ltimo, compruebe el Habilitar edicin casilla de verificacin de la GridView tag 's inteligente. Despus de completar estos pasos de diseo de la pgina ErrorHandling.aspx debe ser similar a la Figura 4.

Figura 4. Quitar todos menos el BoundFields necesario y comprobar la casilla de verificacin Habilitar edicin. En este punto, tenemos una lista de todos los productos " ProductName , CantidadPorUnidad , PrecioUnidad yUnitsInStock campos, sin embargo, slo el ProductName , PrecioUnidad y UnitsInStock campos se pueden editar.

Figura 5. Los usuarios pueden ahora fcilmente editar los nombres de productos, precios, y los campos de las unidades en stock.

Paso 2: Manejo de Gracia DAL-Level excepciones


Si bien nuestro editable GridView funciona de maravilla cuando el usuario introduzca los valores legales para editar el nombre del producto, el precio, y las unidades en stock, entrando en valores resulta ilegal en una excepcin. Por ejemplo, omitiendo el ProductName valor hace un NoNullAllowedException ser lanzado desde el ProductNamepropiedad en el ProdcutsRow clase tiene su AllowDBNull propiedad establecida en falso , y si la base de datos est inactivo, un SqlException ser lanzada por el TableAdapter al intentar conectarse a la base de datos . Sin tomar ninguna medida, estas excepciones a la burbuja de la capa de acceso a datos a la capa de lgica de negocio, y luego a la pgina de ASP.NET y, finalmente, el tiempo de ejecucin de ASP.NET. Dependiendo de cmo la aplicacin Web se configura y si usted est visitando la aplicacin de localhost , una excepcin no controlada puede resultar en un servidor genrico de error de pgina, un informe de error detallados o una pgina web fcil de usar. Ver Aplicacin Web Manejo de errores en ASP.NET y el elemento customErrors para obtener ms informacin acerca de cmo el tiempo de ejecucin ASP.NET responde a una excepcin no capturada. La figura 6 muestra la pantalla encontramos al intentar actualizar un producto sin especificar el ProductName valor. Este es el informe detallado de error por defecto aparece cuando viene a travs de localhost .

Figura 6. Omitiendo el nombre del producto se mostrar detalles de la excepcin. Aunque los detalles tales excepciones son tiles cuando se prueba una aplicacin, la presentacin de un usuario final con una pantalla en la cara de una excepcin no es la ideal. Un usuario final probablemente no sabe lo que es unNoNullAllowedException es o por qu causa fue. Un mejor enfoque es el de presentar al usuario con un mensaje ms fcil de explicar que haba problemas al intentar actualizar el producto.

Si se produce una excepcin cuando se realiza la operacin, los eventos de nivel post-tanto en el ObjectDataSource y el control web de datos proporcionan un medio para detectar y anular la excepcin de burbujas hasta el tiempo de ejecucin de ASP.NET. Para nuestro ejemplo, vamos a crear un controlador de eventos para el GridView 's RowUpdatedevento que determina si una excepcin se ha disparado y, de ser as, se muestran los detalles de excepcin en unaetiqueta de control Web. Empezar por agregar una etiqueta a la pgina de ASP.NET, el establecimiento de su ID de propiedad deExceptionDetails y limpiar su texto la propiedad. Con el fin de llamar la atencin del usuario a este mensaje, establezca su CssClass propiedad de advertencia , que es una clase CSS que agregamos a la styles.css archivo en el tutorial anterior. Hay que recordar que esta clase CSS hace que la etiqueta de texto 's que se muestran en color rojo, cursiva, negrita, tipo de letra extra grande.

Figura 7. Agregue un control Web Label a la pgina. Como queremos que esta etiqueta de control Web sea visible slo inmediatamente despus de una excepcin se ha producido, establezca su Visible propiedad a falso en el Page_Load controlador de eventos:
protected void Page_Load (object sender, EventArgs e) { ExceptionDetails.Visible = false; }

Con este cdigo, sobre la visita de la primera y devoluciones de datos subsiguientes de la ExceptionDetails de control tendr su Visible propiedad establecida en falso . En la

cara de un DAL-nivel o BLL excepcin de nivel, que podemos detectar en el GridView 's RowUpdated controlador de eventos, vamos a configurar el ExceptionDetails controlVisible propiedad en true. Desde Web controladores de eventos de control se producen despus de que el Page_Loadcontrolador de eventos en el ciclo de vida de la pgina, la etiqueta se mostrar. Sin embargo, en la devolucin de datos siguiente, el Page_Load controlador de eventos volver el Visible propiedad a falso , ocultndolo de la vista de nuevo. Nota: Como alternativa, se podra eliminar la necesidad de establecer el ExceptionDetails control visiblede propiedad en Page_Load mediante la asignacin de su visible de propiedad falsos en la sintaxis declarativa y el desmantelamiento de su estado de vista (ajuste de su EnableViewState propiedad a falso). Vamos a utilizar este enfoque alternativo en un tutorial futuro. Con la etiqueta de control adicional, nuestro siguiente paso es crear el controlador de eventos del GridView 'sRowUpdated evento. Seleccione el GridView en el diseo, ir a la ventana Propiedades, y haga clic en el icono de rayo, una lista de los GridView eventos 's. Ya debera haber ya una entrada all para el GridView 's RowUpdating caso, como hemos creado un controlador de eventos para este evento anteriormente en este tutorial. Crear un controlador de eventos para el RowUpdated evento as.

Figura 8. Cree un controlador de eventos para el evento RowUpdated del GridView. Nota: Tambin puede crear el controlador de eventos a travs de la lista desplegable en la parte superior del archivo de clase de cdigo subyacente. Seleccione el GridView de la lista desplegable a la izquierda y la RowUpdated caso de la de la derecha. La creacin de este controlador de eventos se agregue el siguiente cdigo en el cdigo subyacente de la pgina ASP.NET de clase:
protected void GridView1_RowUpdated (object sender, GridViewUpdatedEventArgs e) { }

Parmetro de este controlador de eventos de la segunda entrada es un objeto de tipo GridViewUpdatedEventArgs , que tiene tres propiedades de inters para el manejo de excepciones:

Excepcin -una referencia a la excepcin que se produce, si no es la excepcin ha sido lanzado, esta propiedad tendr un valor de null . ExceptionHandled -Un valor booleano que indica si la excepcin se ha controlado en el RowUpdatedcontrolador de eventos, si falsa (por defecto), la excepcin se vuelve a producir, se filtra hasta el tiempo de ejecucin de ASP.NET. KeepInEditMode -Si se establece en verdadera la edicin GridView fila permanece en modo de edicin, si falsa(por defecto), el GridView fila vuelve a su modo de slo lectura.

Nuestro cdigo, a continuacin, debe comprobar para ver si la excepcin no es nula , lo que significa que una excepcin fue planteada en el desempeo de la operacin. Si este es el caso, queremos:

Muestra un mensaje fcil de usar en el ExceptionDetails etiqueta . Indican que la excepcin se ha controlado. Mantenga el GridView fila en modo de edicin.

Este cdigo se lleva a cabo estos objetivos:


protected void GridView1_RowUpdated (object sender, GridViewUpdatedEventArgs e) { if (e.Exception! = null) { / / Muestra un mensaje fcil de usar ExceptionDetails.Visible = true; ExceptionDetails.Text = "Ha habido un problema al actualizar el producto."; if (e.Exception.InnerException! = null) { Excepcin interna = e.Exception.InnerException; if (interior es System.Data.Common.DbException) ExceptionDetails.Text + = "Nuestra base de datos est experimentando problemas." + "Por favor, intntelo de nuevo ms tarde."; else if (interior es NoNullAllowedException)

ExceptionDetails.Text + = "Hay uno o ms campos obligatorios que faltan."; else if (interior es ArgumentException) { paramName cadena = ((ArgumentException) interna) ParamName.; ExceptionDetails.Text + = String.Concat ("El", paramName, "el valor es ilegal."); } else if (interior es ApplicationException) ExceptionDetails.Text + = inner.Message; } / / Indica que la excepcin se ha manejado e.ExceptionHandled = true; / / Mantener la fila en modo de edicin e.KeepInEditMode = true;

} }

Este controlador de eventos comienza con la comprobacin para ver si e.Exception es nula . Si no es as, laExceptionDetails etiqueta 's Visible propiedad se establece en verdadero , y su texto a la propiedad "Hubo un problema al actualizar el producto." Los detalles de la excepcin actual que fue lanzado residen en el e.Exceptionobjeto InnerException propiedad. Esta excepcin interna se examina y, si se trata de un tipo particular, un mensaje adicional, til se aade a la ExceptionDetails etiqueta 's de texto de propiedad. Por ltimo, el ExceptionHandled yKeepInEditMode propiedades se establecen en verdad . La Figura 9 muestra una captura de pantalla de esta pgina cuando se omite el nombre del producto; La figura 10 muestra los resultados al introducir una ilegal PrecioUnidad valor (50).

Figura 9. El BoundField ProductName debe contener un valor.

Figura 10. Los valores negativos PrecioUnidad no estn permitidos. Al establecer la e.ExceptionHandled propiedad real , la RowUpdated controlador de eventos ha indicado que se ha manejado la excepcin. Por lo tanto, la excepcin no se propagar hasta el tiempo de ejecucin de ASP.NET. Nota: Las figuras 9 y 10 muestran una manera elegante de manejar las excepciones planteadas por la entrada del usuario no vlida. Lo ideal, sin embargo, de entrada no vlidos, no se llega a la capa de lgica de negocio en el primer lugar, como la pgina de ASP.NET debe asegurarse de que las entradas del usuario son vlidos antes de invocar el ProductsBLL clase UpdateProduct mtodo. En nuestro prximo captulo, veremos cmo agregar controles de validacin para las interfaces de edicin e insercin para asegurarse de que los datos presentados a la capa de lgica de negocio se ajusta a las reglas de negocio. Los controles de validacin no slo evitar la invocacin de la UpdateProduct mtodo hasta que el usuario los datos proporcionados son vlidos, sino que tambin proporcionan una experiencia de usuario ms informativo para la identificacin de los problemas de entrada de datos.

Paso 3: Manejo de Gracia BLL-Level excepciones


Al insertar, actualizar o eliminar datos, la capa de acceso a datos puede producir una excepcin en la cara de un error de datos relacionados. La base de datos puede estar fuera de lnea, una columna de base de datos requerida por la tabla no podra haber tenido un valor especfico, o una restriccin a nivel de tabla puede haber sido violada. Adems de las estrictamente relacionadas con los datos excepciones, la capa de lgica de negocio pueden utilizar las excepciones para indicar que las reglas de negocio han sido violados. En Tutorial 2: Crear una capa de lgica de negocio , por ejemplo, hemos aadido un control de la empresa a la regla original de UpdateProduct sobrecarga. En concreto, si el usuario se marca como un producto descontinuado, se requiere que el producto no sea la nica proporcionada por su proveedor. Si esta condicin se ha violado, una ApplicationException fue lanzado.

Para el UpdateProduct sobrecarga creado en este tutorial, vamos a aadir una regla de negocio, que prohbe laPrecioUnidad campo se establece en un valor nuevo que es ms del doble de la original PrecioUnidad valor. Para lograr esto, ajustar el UpdateProduct sobrecarga de modo que se realice este control y se produce unaApplicationException si la regla es violada. El mtodo de actualizacin siguiente:
pblica UpdateProduct bool (cadena productName, decimal? precioUnitario, corto? UnitsInStock, int ProductID) { Northwind.ProductsDataTable productos = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0]; / / Asegrese de que el precio no ha ms que duplicado if (precioUnitario! = null & &! product.IsUnitPriceNull ()) if (precioUnitario> product.UnitPrice * 2) throw new ApplicationException ( "Cuando la actualizacin de un precio del producto," + "El nuevo precio no puede exceder el doble del precio original."); product.ProductName = productName; if (precioUnitario == null) product.SetUnitPriceNull (); ms product.UnitPrice = unitPrice.Value; if (UnitsInStock == null) product.SetUnitsInStockNull (); ms product.UnitsInStock = unitsInStock.Value; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1;

Con este cambio, cualquier actualizacin de precios que es ms del doble del precio actual provocar unaApplicationException ser lanzada. Al igual que la excepcin planteada a partir de la DAL, esta BLL-raiseApplicationException pueden ser detectados y manejados en el GridView 's RowUpdated controlador de eventos. De hecho, el RowUpdated cdigo de controlador de eventos, como por escrito, correctamente detectar esta excepcin y mostrar el ApplicationException 's Mensaje valor de la propiedad. La figura 11 muestra una captura de pantalla cuando el usuario intenta actualizar el precio de Chai a $ 50.00, que es ms del doble de su precio actual de $ 19.95.

Figura 11. Las reglas de negocio aumenta el precio no permitir que ms del doble de precio de un producto. Nota: Idealmente, nuestra lgica de reglas de negocio sera reprogramado para salir de laUpdateProduct sobrecargas del mtodo y en un mtodo comn. Esto se deja como ejercicio para el lector.

Conclusin
Durante la insercin, actualizacin y eliminacin de las operaciones, tanto en el control de los datos y la WebObjectDataSource fuego involucradas pre-grado y nivel de posteventos que sujetalibros la operacin real. Como hemos visto en este tutorial y el anterior, cuando se trabaja con un editable GridView el GridView 's RowUpdating se activa el evento, seguido por el ObjectDataSource 's Actualizacin de evento, momento en el que se hace el comando de actualizacin con el ObjectDataSource 's objeto subyacente. Despus de la operacin se ha completado, elObjectDataSource 's Actualizado activa el evento, seguido por el GridView 's RowUpdated evento. Podemos crear controladores de eventos para los eventos de pre-grado con el fin de personalizar los parmetros de entrada o de los eventos de nivel post-con el fin de inspeccionar y responder a los resultados de la operacin. Nivel de post-controladores de eventos son los ms comnmente utilizados para detectar si se produjo una excepcin durante la operacin. En el rostro de una excepcin, estos controladores de eventos de nivel post-opcionalmente puede controlar la excepcin por su propia cuenta. En este tutorial, hemos visto cmo manejar esa excepcin, mostrando un mensaje de error descriptivo.

En el siguiente tutorial, vamos a ver cmo reducir la posibilidad de excepciones derivadas de problemas de formato de datos (como la introduccin de un negativo PrecioUnidad ). En concreto, vamos a ver cmo agregar controles de validacin para las interfaces de edicin e insercin.

Tutorial 19: Adicin de controles de validacin a las interfaces de edicin e insercin de


Scott Mitchell 03 2007 Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) En este tutorial, vamos a ver lo fcil que es aadir controles de validacin para el EditItemTemplate y InsertItemTemplate de un control web de datos para proporcionar una interfaz de usuario ms infalible. (19 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 19 (Visual C #) Introduccin Paso 1: Replicar el ejemplo de "Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin de" Paso 2: Convertir el BoundFields en TemplateFields Paso 3: Agregar los controles de validacin de EditItemTemplates el GridView Paso 4: Resumen de entrada de datos problemas Paso 5: Agregar los controles de validacin a la DetailsView de InsertItemTemplate Paso 6: Particin de los controles de validacin en la validacin de los grupos Conclusin

Introduccin
El GridView y DetailsView controles en los ejemplos que hemos explorado en los ltimos tres tutoriales han sido compuesta por BoundField s y CheckBoxField s (los tipos de campo aadidas automticamente por Microsoft Visual Studio al enlazar un GridView o DetailsView a un control de origen de datos a travs de la etiqueta inteligente). Al editar una fila de un GridView o DetailsView , los BoundField s que no son de slo lectura se convierten en cuadros de texto, a partir de la cual el usuario puede modificar los datos existentes. Del mismo modo, al insertar un nuevo registro en un DetailsView de control, los BoundField s cuya InsertVisible propiedad est establecida en verdadero(por defecto) se representan como cuadros de texto vacos, en los que el usuario puede proporcionar valores del nuevo registro de campo. Del mismo

modo, CheckBoxField s, que se desactivan en la norma, de slo lectura de la interfaz, se convierten en las casillas habilitadas en las interfaces de edicin e insercin. Mientras que el valor predeterminado de edicin e insercin de interfaces para el BoundField y CheckBoxField puede ser til, la interfaz no tiene ningn tipo de validacin. Si un usuario hace una entrada de datos error-como la omisin de la ProductName campo o entrar en un valor no vlido para UnitsInStock (por ejemplo, -50), una excepcin se levant desde las profundidades de la arquitectura de la aplicacin. Aunque esta excepcin puede ser manejado con gracia como se demuestra en el tutorial anterior , lo ideal es la interfaz de usuario de edicin o insercin que incluyen controles de validacin para evitar que un usuario entre en tales datos no vlidos en el primer lugar. A fin de proporcionar una interfaz personalizada de edicin o insercin, tenemos que sustituir la BoundField oCheckBoxField con un TemplateField . TemplateField s, que fueron el tema de discusin en el Tutorial 12: Uso de TemplateFields en el control GridView y Tutorial 13: Uso de TemplateFields en DetailsView , puede constar de varias plantillas de definicin de interfaces separadas para los Estados fila. El TemplateField 's ItemTemplate se utiliza para cuando la prestacin campos de slo lectura o filas en el DetailsView o GridView controles, mientras que elEditItemTemplate y InsertItemTemplate indican las interfaces con el uso de los modos de edicin y la insercin, respectivamente. En este tutorial, vamos a ver lo fcil que es aadir controles de validacin para el TemplateField 's EditItemTemplate yInsertItemTemplate para proporcionar una interfaz de usuario ms infalible. En concreto, este tutorial toma el ejemplo creado en Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin y aumenta la edicin y la insercin de las interfaces para incluir la validacin correspondiente.

Paso 1: Replicar el ejemplo de "Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin"
En Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin , hemos creado una pgina en la que figuran los nombres y los precios de los productos en un editable GridView . Adems, la pgina incluye un DetailsView cuya DefaultMode propiedad se estableci en Insertar , por lo tanto siempre la representacin en modo de insercin. A partir de este DetailsView , el usuario puede introducir el nombre y el precio de un producto nuevo, haga clic en Insertar , y lo han aadido al sistema (ver Figura 1).

Figura 1. El ejemplo anterior permite a los usuarios aadir nuevos productos y editar las existentes. Nuestro objetivo para este tutorial es para aumentar el DetailsView y GridView para proporcionar controles de validacin. En particular, la lgica de validacin:

Exigir que el nombre se proporcionar al insertar o editar un producto. Exige que el precio se proporcionar al insertar un registro, cuando se edita un disco, que an se requiere un precio, sino que utilizan la lgica de programacin en el GridView 's RowUpdating controlador de eventos ya estn presentes en el tutorial anterior. Asegrese de que el valor introducido por el precio es un formato de moneda vlida.

Antes de que podamos mirar a aumentar el ejemplo anterior para incluir la validacin, primero tenemos que replicar el ejemplo de la pgina DataModificationEvents.aspx a la pgina de este tutorial, UIValidation.aspx. Para lograr esto, tenemos que copiar en el marcado declarativo de la pgina DataModificationEvents.aspx y su cdigo fuente. En primer lugar, copie el marcado declarativo mediante la realizacin de los siguientes pasos: 1. Abra la pgina DataModificationEvents.aspx en Visual Studio. 2. Ir al marcado declarativo de la pgina (pulse en la Fuente en la parte inferior de la pgina). 3. Copiar el texto en el <asp:Content> y </ asp: Content> etiquetas (lneas 3 y 44), como se muestra en la Figura 2.

Figura 2. Copiar el texto dentro del control <asp:Content>. 1. Abra la pgina UIValidation.aspx. 2. Ir al marcado declarativo de la pgina. 3. Pegue el texto en el <asp:Content> control. Para copiar el cdigo fuente, abra la pgina DataModificationEvents.aspx.cs y copiar slo el texto dentro de laEditInsertDelete_DataModificationEvents clase. Copie los tres controladores de eventos ( Load ,GridView1_RowUpdating y ObjectDataSource1_Inserting ), pero no copia la declaracin de clase o con los estados.Pegue el texto copiado en el EditInsertDelete_UIValidation clase en UIValidation.aspx.cs. Despus de mover sobre el contenido y el cdigo de DataModificationEvents.aspx a UIValidation.aspx, tome un momento para poner a prueba su progreso en un navegador. Usted debe ver la salida del mismo y la experiencia de la misma funcionalidad en cada una de estas dos pginas (de nuevo la figura 1 para una captura de pantalla de DataModificationEvents.aspx en accin).

Paso 2: Convertir el BoundFields en TemplateFields


Para agregar controles de validacin para las interfaces de edicin e insercin, el BoundField s utilizados por elDetailsView y GridView controles tienen que ser convertidos en TemplateField s. Para lograr esto, haga clic en elEditar columnas y editar campos enlaces en el GridView y DetailsView etiquetas "inteligentes s, respectivamente. All, seleccione cada uno de los BoundField s y haga clic en el Convertir este campo en un TemplateField enlace.

Figura 3. Convertir cada uno de los de DetailsView y GridView BoundFields en TemplateFields. Conversin de un BoundField en un TemplateField a travs de la Campos cuadro de dilogo genera unTemplateField que exhibe la misma de slo lectura, la edicin y la insercin de las interfaces como el BoundField s mismo. El marcado siguiente se muestra la sintaxis declarativa para el ProductName de campo en el DetailsViewdespus de que se ha convertido en un TemplateField :
<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: TextBox> </ EditItemTemplate> <InsertItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: TextBox> </ InsertItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Tenga en cuenta que este TemplateField tena tres plantillas creadas automticamente: ItemTemplate ,EditItemTemplate y InsertItemTemplate . El ItemT emplate muestra un solo valor de datos de campo ( ProductName) con una etiqueta de control de Internet, mientras que el EditItemTemplate y InsertItemTemplate presentar el valor de los datos de campo en un cuadro de texto de control Web que asocie el campo de datos con el cuadro de texto 'sde texto con la propiedad de dos vas de enlace de datos. Ya que slo est usando el DetailsView en esta pgina para insertar,

puede quitar el ItemTemplate y EditItemTemplate de los dos TemplateField s, aunque no hay nada de malo en salir de ellos. Dado que el GridView no es compatible con la incorporada en la insercin de las caractersticas de la DetailsView , que convierte el GridView 's ProductName de campo en un TemplateField resultados en tan slo un ItemTemplate yEditItemTemplate :
<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName"> <EditItemTemplate> <Asp: TextBox ID = "TextBox1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: TextBox> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Al hacer clic en el Convertir este campo en un TemplateField enlace, Visual Studio ha creado un TemplateField cuyo plantillas de imitar la interfaz de usuario de los conversos BoundField . Usted puede verificar esto visitando esta pgina a travs de un navegador. Usted encontrar que la apariencia y el comportamiento del TemplateField s es idntica a la experiencia cuando BoundField s se utilizaron en su lugar. Nota: No dude en personalizar las interfaces de edicin de las plantillas cuando sea necesario. Por ejemplo, puede querer tener el cuadro de texto en el PrecioUnidad TemplateField s representa como un cuadro de texto ms pequeo que el ProductName cuadro de texto. Para lograr esto se puede establecer el cuadro de texto 's columnas de propiedad a un valor adecuado o proporcionar un ancho absoluto a travs del ancho de la propiedad. En el siguiente tutorial, veremos cmo personalizar totalmente la interfaz de edicin mediante la sustitucin del cuadro de texto con un control de Web alternativo de entrada de datos.

Paso 3: Agregar los controles de validacin de EditItemTemplates el GridView


Cuando la construccin de formas de entrada de datos, es importante que los usuarios introducen todos los campos requeridos, y que todas las aportaciones son legales, con el formato adecuado los valores. Para ayudar a asegurar que las aportaciones de los usuarios son vlidas, ASP.NET proporciona cinco incorporado en los controles de validacin que estn diseados para ser utilizados para validar el valor de un control de entrada nica:

RequiredFieldValidator : Asegura que un valor ha sido siempre CompareValidator -Valida un valor con otro valor de control Web o un valor constante, o se asegura de que el formato del valor es legal para un tipo de datos especificado RangeValidator -Asegura que un valor est dentro de un rango de valores RegularExpressionValidator -Valida un valor en contra de una expresin regular CustomValidator -Valida un valor con un mtodo personalizado, definido por el usuario

Para ms informacin sobre estos cinco controles, echa un vistazo a la seccin de controles de validacin de lostutoriales de inicio rpido de ASP.NET . Para nuestro tutorial, tendremos que usar un RequiredFieldValidator , tanto en el DetailsView y GridView 'sProductName TemplateField s y un RequiredFieldValidator en el DetailsView 's PrecioUnidad TemplateField .Adems, tendremos que aadir un CompareValidator a ambos controles " PrecioUnidad TemplateField s que asegura que el precio de entrada tiene un valor mayor o igual a 0 y se presenta en un formato de moneda vlida. Nota: Aunque ASP.NET 1.x tenido estos mismos cinco controles de validacin, ASP.NET 2.0 ha aadido una serie de mejoras, las dos principales que del lado del cliente admite secuencias de comandos para los navegadores que no sean Microsoft Internet Explorer y la capacidad de los controles de validacin de particin en una pgina en grupos de validacin. Para ms informacin sobre el nuevo control de validacin caractersticas en 2.0, consulte la diseccin de los controles de validacin en ASP.NET 2.0 . Vamos a empezar por la adicin de los controles de validacin necesarios para la EditItemTemplate s en el GridView's TemplateField s. Para lograr esto, haga clic en el Editar plantillas de enlace desde el GridView tag 's inteligente para que aparezca la interfaz de edicin de plantilla. A partir de aqu, puede seleccionar la plantilla que desea editar en la lista desplegable. Dado que queremos enriquecer la interfaz de edicin, tenemos que aadir los controles de validacin a la ProductName y PrecioUnidad 's EditItemTemplate s.

Figura 4. Tenemos que extender la ProductName y EditItemTemplates PrecioUnidad es. En el ProductName EditItemTemplate , agregue un RequiredFieldValidator arrastrndolo desde la caja de herramientas en la interfaz de edicin de plantillas, despus de la colocacin de cuadro de texto .

Figura 5. Aadir un RequiredFieldValidator a la EditItemTemplate ProductName. Todos los controles de validacin de trabajo mediante la validacin de la entrada de un control ASP.NET Web nica. Por lo tanto, tenemos que indicar que el RequiredFieldValidator que acaba de agregar debe validar contra el cuadro de texto en el EditItemTemplate , esto se logra mediante el establecimiento del control de validacin de la propiedad ControlToValidate a la ID del control Web correspondiente. El cuadro de texto en la actualidad tiene el ms anodino IDde TextBox1 , pero vamos a cambiar a algo ms apropiado. Haga clic en el cuadro de texto en la plantilla y, a continuacin, desde la ventana Propiedades, cambie el ID de TextBox1 a EditProductName .

Figura 6. Cambiar el ID del cuadro de texto para EditProductName.

A continuacin, establezca el RequiredFieldValidator 's ControlToValidate propiedad EditProductName . Por ltimo, establezca la propiedad ErrorMessage a "Usted debe proporcionar el nombre del producto" y la propiedad de texto a "*". El texto valor de la propiedad, si la hay, es el texto que se muestra en el control de validacin si el error en la validacin. El ErrorMessage valor de la propiedad, que se requiere, es utilizado por el ValidationSummary de control, si el texto valor de la propiedad se omite, el ErrorMessage valor de la propiedad es tambin el texto mostrado por el control de validacin en la entrada no vlida. Despus de establecer estas tres propiedades de la RequiredFieldValidator , la pantalla debe ser similar a la Figura 7.

Figura 7. Establecer el RequiredFieldValidator ControlToValidate es, ErrorMessage, y las propiedades de texto. Con el RequiredFieldValidator aadido a la ProductName EditItemTemplate , todo lo que queda es aadir la validacin necesaria para la PrecioUnidad EditItemTemplate . Desde que hemos decidido que, para esta pgina, elPrecioUnidad es opcional la hora de editar un disco, no es necesario agregar un RequiredFieldValidator . Nosotros, sin embargo, que aadir un CompareValidator para asegurar que el Precio por unidad , si fue suministrado, tiene el formato correcto como moneda y es mayor o igual a 0. Antes de aadir el CompareValidator a la PrecioUnidad EditItemTemplate , primero vamos a cambiar el cuadro de texto web de control de identificacin de TextBox2 a EditUnitPrice . Despus de hacer este cambio, agrega elCompareValidator , estableciendo su ControlToValidate propiedad EditUnitPrice , su ErrorMessage propiedad de "El precio debe ser mayor o igual a cero y no puede incluir el smbolo de la moneda", y su texto a la propiedad "*".

Para indicar que el PrecioUnidad valor debe ser mayor o igual a 0, el conjunto CompareValidator 's propiedad del operador de GreaterThanEqual , su propiedad ValueToCompare a "0", y su propiedad de tipo de divisas . La sintaxis declarativa siguiente muestra la PrecioUnidad TemplateField 's EditItemTemplate despus de estos cambios se han hecho:
<EditItemTemplate> <Asp: TextBox ID = "EditUnitPrice" runat = "server" Texto ='<%# Bind ("Precio por unidad", "{0: c}")%> ' Columnas = "6"> </ asp: TextBox> <Asp: CompareValidator ID = "CompareValidator1" runat = "server" ControlToValidate = "EditUnitPrice" ErrorMessage = "El precio debe ser mayor o igual a cero y no puede incluir el smbolo de la moneda " Operador = "GreaterThanEqual" type = "Moneda" ValueToCompare = "0 ">*</ asp: CompareValidator> </ EditItemTemplate>

Despus de hacer estos cambios, abra la pgina en un navegador. Si intenta omitir el nombre o introduzca un valor de precio vlido durante la edicin de un producto, aparece un asterisco junto al cuadro de texto. Como muestra la Figura 8 se muestra un valor de precio que incluye el smbolo de la moneda, tales como $ 19.95-se considera vlido. ElCompareValidator 's de divisas tipo permite separadores de dgitos (por ejemplo, comas o puntos, dependiendo de la configuracin de la cultura) y un signo inicial ms o menos, pero no permitir que un smbolo de moneda. Este comportamiento puede dejar perplejo como los usuarios de la interfaz de edicin en la actualidad hace que el Precio por unidad con el formato de moneda. Nota: Recuerde que en el Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin , se establece el BoundField 's DataFormatString propiedad {0: c} con el fin de darle formato como moneda. Adems, se establece el ApplyFormatInEditMode propiedad real , haciendo que el GridView interfaz 's de edicin para dar formato al PrecioUnidad como moneda. Al convertir el BoundField en un TemplateField , Visual Studio tom nota de estos ajustes y el formato delcuadro de texto 's de texto de propiedad como una moneda con la sintaxis de enlace de datos <% # Bind ("Precio por unidad", "{0: c}")%> .

Figura 8. Aparece un asterisco junto a los cuadros de texto con la entrada no es vlida. Mientras que la validacin de las obras tal cual, el usuario tiene que quitar manualmente el smbolo de la moneda cuando se edita un registro, que no es aceptable. Para remediar esto, tenemos tres opciones:
1. Configurar el EditItemTemplate para que el PrecioUnidad valor no est

formateado como moneda.


2. Permitir que el usuario introduzca un smbolo de moneda mediante la eliminacin de

la CompareValidator y su sustitucin por un RegularExpressionValidator que comprueba correctamente por un valor de la moneda con el formato adecuado. El problema aqu es que la expresin regular para validar un valor de la moneda no es bastante y se requiere escribir cdigo si queramos incorporar ajustes de la cultura. 3. Eliminar por completo el control de validacin y se basan en la lgica de validacin en el servidor en el GridView's RowUpdating controlador de eventos. Vamos a ir con la opcin # 1 para este ejercicio. En la actualidad, la PrecioUnidad tiene el formato de una moneda debido a la expresin de enlace de datos para el cuadro de texto en el EditItemTemplate : <% # Bind ("Precio por unidad", "{0: c}") %> Cambiar la vinculacin declaracin a Bind (" Precio por unidad "," {0: N2} ") , que da formato al resultado como un nmero con dos dgitos de precisin. Esto se puede hacer directamente a travs de la sintaxis declarativa o haciendo clic en el Editar DataBinding enlace de la EditUnitPrice TextBox en el PrecioUnidadTemplateField 's EditItemTemplate (ver Figuras 9 y 10).

Figura 9. Haga clic en el enlace Editar del cuadro de texto DataBindings.

Figura 10. Especifique el especificador de formato en la declaracin de enlace. Con este cambio, el precio de formato en la interfaz de edicin incluye la coma como separador de grupo y un punto como separador decimal, pero deja fuera el smbolo de moneda. Nota: El Precio por unidad EditItemTemplate no incluye un RequiredFieldValidator , lo que permite la devolucin de datos a producirse y la lgica de actualizacin de comenzar. Sin embargo, el RowUpdatingcontrolador de eventos copiado de Tutorial 17:

Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin incluye un cheque de programacin que asegura que elPrecioUnidad se proporciona. Sintase libre para eliminar esta lgica, lo deje en como est, o aadir unRequiredFieldValidator a la PrecioUnidad EditItemTemplate .

Paso 4: Resumen de los problemas de entrada de datos


Adems de los cinco controles de validacin, ASP.NET incluye el control ValidationSummary , que muestra elErrorMessage s de los controles de validacin que detectan datos no vlidos. Este resumen de los datos se pueden mostrar como texto en la pgina web oa travs de un modal, cuadro de mensaje en el cliente. Vamos a mejorar este tutorial para incluir un cuadro de mensaje en el cliente que resume los problemas de validacin. Para lograr esto, arrastre un ValidationSummary el control del cuadro de herramientas hasta el diseador. La ubicacin de la validacin de control en realidad no importa, ya que vamos a configurar para mostrar slo el resumen como un cuadro de mensaje. Despus de agregar el control, establezca su propiedad ShowSummary a falsos y supropiedad ShowMessageBox de verdad . Con esta adicin, los errores de validacin se resumen en un cuadro de mensaje en el cliente.

Figura 11. Los errores de validacin se resumen en un cuadro de mensaje en el cliente.

Paso 5: Agregar los controles de validacin a la InsertItemTemplate DetailsView de

Todo lo que queda de este tutorial es aadir los controles de validacin a la DetailsView interfaz 's la insercin. El proceso de aadir controles de validacin para el DetailsView plantillas 's es idntica a la que se examinaron en el paso 3, por lo tanto, vamos a pasar rpidamente por la tarea en este paso. Como lo hicimos con el GridView 'sEditItemTemplate s, os animo a cambiar el nombre del ID s de la TextBox es el indescriptible TextBox1 y TextBox2 aInsertProductName y InsertUnitPrice . Aadir un RequiredFieldValidator a la ProductName InsertItemTemplate . Establecer el ControlToValidate a laidentificacin de los TextBox en la plantilla, el texto de la propiedad "*" y su ErrorMessage propiedad "Debe proporcionar el nombre del producto". Desde el PrecioUnidad se requiere para esta pgina cuando se aade un nuevo registro, agregar unRequiredFieldValidator a la PrecioUnidad InsertItemTemplate , estableciendo su ControlToValidate , texto , yErrorMessage propiedades adecuadamente. Finalmente, agregue una CompareValidator a la PrecioUnidadInsertItemTemplate as, la configuracin de su ControlToValidate , texto , ErrorMessage , Tipo , operador , yValueToCompare propiedades al igual que hicimos con el PrecioUnidad 's CompareValidator en el GridView 'sEditItemTemplate . Despus de la adicin de estos controles de validacin, un nuevo producto no se puede aadir al sistema si su nombre no se suministra o si su precio es un nmero negativo o con formato de manera ilegal.

Figura 12. La lgica de validacin ha sido aadido a la interfaz de la insercin de la DetailsView es.

Paso 6: Particin de los controles de validacin en grupos de validacin


Nuestra pgina se compone de dos conjuntos lgicamente dispares de los controles de validacin: las que corresponden a la GridView 's interfaz de edicin y las que corresponden a la DetailsView 's interfaz de insercin. Por defecto, cuando se produce una devolucin de datos todos los controles de validacin de la pgina se comprueban. Sin embargo, cuando se edita un registro, no queremos que el DetailsView validacin de la interfaz 's la insercin de los controles para validar. La figura 13 muestra nuestro dilema actual: Cuando un usuario est editando un producto con valores perfectamente legal, haga clic en Actualizacin de las causas de un error de validacin debido a que el nombre y los valores de precios en la interfaz de insercin estn en blanco.

Figura 13. La actualizacin de un producto provoca una validacin de la interfaz de la insercin de los controles a los incendios. Los controles de validacin en ASP.NET 2.0 pueden dividirse en grupos de validacin a travs de sus ValidationGrouppropiedad. Para asociar un conjunto de controles de validacin en un grupo, basta con establecer su ValidationGrouppropiedad con el mismo valor. Para el tutorial, establezca la ValidationGroup propiedades de los controles de validacin en el GridView 's TemplateField s de EditValidationControls y el ValidationGroup propiedades de laDetailsView 's TemplateField s de InsertValidationControls . Estos cambios se pueden hacer directamente en el marcado declarativo oa travs de la ventana Propiedades cuando se utiliza el Diseador de edicin de la plantilla de interfaz. Adems de los controles de validacin, el botn y el botn relacionadas con los controles en ASP.NET 2.0 tambin incluye una ValidationGroup propiedad. Validadores de un grupo de validacin se comprueba su validez slo cuando una devolucin de datos es inducida

por un botn que tiene el mismo ValidationGroup valor de la propiedad. Por ejemplo, para que el DetailsView 's Insertar botn para activar el InsertValidationControls grupo de validacin que necesitan para establecer la CommandField 's ValidationGroup propiedad InsertValidationControls (ver Figura 14).Adems, establecer el GridView 's CommandField 's ValidationGroup propiedad EditValidationControls .

Figura 14. Establecer el DetailsView de CommandField de propiedad ValidationGroup InsertValidationControls. Despus de estos cambios, el DetailsView y GridView 's TemplateField s y CommandField s debe ser similar a lo siguiente. TemplateFields el DetailsView y CommandField:
<Asp: TemplateField HeaderText = "ProductName" SortExpression = "ProductName"> <InsertItemTemplate> <Asp: TextBox ID = "InsertProductName" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: TextBox> <Asp: RequiredFieldValidator ID = "RequiredFieldValidator2" runat = "server" ControlToValidate = "InsertProductName" ErrorMessage = "Usted debe proporcionar el nombre del producto" ValidationGroup = "InsertValidationControls"> * </ Asp: RequiredFieldValidator> </ InsertItemTemplate> </ Asp: TemplateField> <asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice"> <InsertItemTemplate> <Asp: TextBox ID = "InsertUnitPrice" runat = "server" Texto ='<%# Bind ("Precio por unidad")%> 'Columnas = "6"> </ Asp: TextBox>

<Asp: RequiredFieldValidator ID = "RequiredFieldValidator3" runat = "server" ControlToValidate = "InsertUnitPrice" ErrorMessage = "Usted debe proporcionar el precio del producto" ValidationGroup = "InsertValidationControls"> * </ Asp: RequiredFieldValidator> <Asp: CompareValidator ID = "CompareValidator2" runat = "server" ControlToValidate = "InsertUnitPrice" ErrorMessage = "El precio debe ser mayor o igual a cero y no puede incluir el smbolo de la moneda " Operador = "GreaterThanEqual" type = "Moneda" ValueToCompare = "0" ValidationGroup = "InsertValidationControls"> * </ Asp: CompareValidator> </ InsertItemTemplate> </ Asp: TemplateField> <Asp: CommandField ShowInsertButton = "True" ValidationGroup = "InsertValidationControls" />

El GridView CommandField y TemplateFields:


<Asp: CommandField ShowEditButton = "True" ValidationGroup = "EditValidationControls" /> <Asp: TemplateField HeaderText = "ProductName" SortExpression = "ProductName"> <EditItemTemplate> <Asp: TextBox ID = "EditProductName" runat = "server" Texto ='<%# Bind ("ProductName")%> '> </ Asp: TextBox> <Asp: RequiredFieldValidator ID = "RequiredFieldValidator1" runat = "server" ControlToValidate = "EditProductName" ErrorMessage = "Usted debe proporcionar el nombre del producto" ValidationGroup = "EditValidationControls"> * </ Asp: RequiredFieldValidator> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("ProductName") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField> <asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice"> <EditItemTemplate> <Asp: TextBox ID = "EditUnitPrice" runat = "server" Texto ='<%# Bind ("Precio por unidad", "{0: N2}")%> 'Columnas = "6"> </ asp: TextBox> <Asp: CompareValidator ID = "CompareValidator1" runat = "server" ControlToValidate = "EditUnitPrice" ErrorMessage = "El precio debe ser mayor o igual a cero y no puede incluir el smbolo de la moneda " Operador = "GreaterThanEqual" type = "Moneda" ValueToCompare = "0" ValidationGroup = "EditValidationControls"> * </ Asp: CompareValidator> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label2" runat = "server" Texto ='<%# Bind ("Precio por unidad", "{0: c}")%> '> </ Asp: Label> </ ItemTemplate> </ Asp: TemplateField>

En este punto, la validacin editar controles especficos de fuego solamente cuando el GridView 's de actualizacin se hace clic en el botn y la validacin de insertar controles especficos de fuego solamente cuando el DetailsView 'sInserte pulsa el botn,

la solucin del problema que resalta la figura 13. Sin embargo, con este cambio de nuestraValidationSummary de control ya no se muestra cuando se introducen datos no vlidos. El ValidationSummarycontrol tambin contiene una ValidationGroup propiedad y slo muestra informacin de resumen de los controles de validacin en su grupo de validacin. Por lo tanto, es necesario tener dos controles de validacin en esta pgina: una para el InsertValidationControls grupo de validacin y uno de EditValidationControls .
<Asp: ValidationSummary ID = "ValidationSummary1" runat = "server" ShowMessageBox = "True" ShowSummary = "false" ValidationGroup = "EditValidationControls" /> <Asp: ValidationSummary ID = "ValidationSummary2" runat = "server" ShowMessageBox = "True" ShowSummary = "false" ValidationGroup = "InsertValidationControls" />

Con esta adicin, el tutorial es completo!

Conclusin
Mientras BoundField s puede proporcionar una insercin y edicin de interfaz, la interfaz no es personalizable. Por lo general, queremos aadir controles de validacin para la interfaz de edicin e insercin para asegurarse de que el usuario introduce los insumos requeridos en un formato legal. Para lograr esto, debe convertir el BoundField s enTemplateField s y aadir los controles de validacin de la plantilla correspondiente (s). En este tutorial, hemos ampliado el ejemplo de Tutorial 17: Examen de los acontecimientos relacionados con la insercin, actualizacin y eliminacin , la adicin de los controles de validacin tanto a la DetailsView 's interfaz de insercin y el GridView 's interfaz de edicin. Por otra parte, hemos visto cmo mostrar la informacin de resumen de validacin con elValidationSummary el control y la forma de particin de los controles de validacin en la pgina de validacin en grupos distintos. Como hemos visto en este tutorial, TemplateField s permite las interfaces de edicin e insercin para ser ampliado para incluir controles de validacin. TemplateField s tambin se puede ampliar para incluir otros controles Web de entrada, permitiendo que el cuadro de texto para ser reemplazado por un control de Web ms adecuado. En nuestro prximo captulo, veremos cmo reemplazar el cuadro de texto con un control de enlace de datos DropDownListcontrol, lo cual es ideal cuando se edita una clave externa (como IdCategora o IdProveedor en los productos de mesa).

Tutorial 20: Personalizacin de la interfaz de modificacin de datos


Scott Mitchell 03 2007

Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) En este tutorial, vamos a ver cmo personalizar la interfaz de un editable GridView , mediante la sustitucin de la norma TextBox y CheckBox con controles alternativos controles de entrada Web. (19 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 20 (Visual C #) Introduccin Paso 1: Creacin de la sobrecarga adecuada UpdateProduct Paso 2: Elaboracin de la GridView editable Paso 3: Usar un DropDownList para la categora de Proveedor de edicin e interfaces Aadiendo las categoras y DropDownLists Proveedores Enlazar el DropDownLists a los campos de datos CategoryID y IdProveedor Tratamiento de valores NULL Paso 4 : El uso de componentes RadioButton para el estado interrumpidas Conclusin

Introduccin
El BoundField s y CheckBoxField s utilizados por el GridView y DetailsView controles simplificar el proceso de modificacin de los datos debido a su capacidad para hacer de slo lectura, editable, y las interfaces insertables. Estas interfaces pueden ser prestados sin necesidad de aadir ningn cdigo adicional declarativa o cdigo. Sin embargo, elBoundField y CheckBoxField interfaces 's carecen de la capacidad de personalizacin a menudo necesaria en escenarios del mundo real. Con el fin de personalizar la interfaz de editar o insertable en un GridView o DetailsView , tenemos que usar en su lugar un TemplateField . En el tutorial anterior , vimos cmo personalizar las interfaces de modificacin de datos mediante la adicin de los controles de validacin web. En este tutorial, vamos a ver cmo personalizar la actual recogida de datos de controles Web, en sustitucin de la BoundField y CheckBoxField 's estndar TextBox y CheckBox controles con alternativas de controles de entrada Web. En particular, vamos a construir un editable GridView que permita el nombre del producto, categora, proveedor, y el estado suspendi a ser actualizado. Al editar una fila en particular, la categora y campos de proveedor se representan como DropDownList s, que contiene el conjunto de las categoras disponibles y los proveedores para elegir. Adems, vamos a reemplazar el CheckBoxField 's por defecto CheckBox con unRadioButtonList de control que ofrece dos opciones: "Activo" y "interrumpidas".

Figura 1. La interfaz del GridView edicin incluye DropDownLists y RadioButton.

Paso 1: Creacin de la sobrecarga adecuada UpdateProduct


En este tutorial, vamos a construir un editable GridView que permita la edicin del nombre de un producto, categora, proveedor, y el estado suspendido. Por lo tanto, necesitamos un UpdateProduct sobrecarga que acepta cinco parmetros de entrada: estos cuatro valores del producto ms el ProductID . Al igual que en nuestro sobrecargas anteriores, ste ser:
1. Recuperar la informacin del producto a partir de la base de datos con el objetivo

especfico ProductID .
2. Actualizar

el ProductName , IdCategora , IdProveedor y descatalogados campos.


3. Enviar la solicitud de actualizacin a la DAL a travs del TableAdapter Update

() mtodo. Por razones de brevedad, por esta sobrecarga en particular que he omitido la comprobacin de los negocios la regla que asegura que un producto sea marcado como discontinuas no es el nico producto que ofrece su proveedor.Sintase libre de agregar en si lo prefiere, o, idealmente, refactorizar la lgica de un mtodo distinto. El siguiente cdigo muestra el nuevo UpdateProduct sobrecarga en el ProductsBLL clase:
[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Update, false)] pblica UpdateProduct bool (productName cadena, int? IdCategora, int? supplierID, bool interrumpido, int ProductID) {

Northwind.ProductsDataTable productos = Adapter.GetProductByProductID (ProductID); if (products.Count == 0) / / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0]; product.ProductName = productName; if (supplierID == null) product.SetSupplierIDNull (); ms product.SupplierID = supplierID.Value; if (IdCategora == null) product.SetCategoryIDNull (); ms product.CategoryID = categoryID.Value; product.Discontinued = interrumpidas; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; }

Paso 2: Elaboracin de la GridView editable


Con la UpdateProduct sobrecarga adicional, estamos listos para crear nuestro editable GridView . Abra elCustomizedUI.aspx pgina en el EditInsertDelete carpeta y agregar un GridView control al diseador. A continuacin, cree un nuevo ObjectDataSource desde el GridView tag 's inteligente. Configurar el ObjectDataSource para recuperar la informacin del producto a travs de la ProductBLL clase GetProducts () mtodo y para actualizar los datos del producto utilizando la UpdateProduct sobrecarga que acabamos de crear. De la INSERTAR y BORRAR las pestaas, seleccione (Ninguno) de las listas desplegables.

Figura 2. Configurar el ObjectDataSource para utilizar la sobrecarga UpdateProduct acaba de crear. Como hemos visto a lo largo de los tutoriales de modificacin de datos, la sintaxis declarativa para elObjectDataSource creado por Microsoft Visual Studio asigna el OldValuesParameterFormatString propiedadoriginal_ {0} . Esto, por supuesto, no va a funcionar con nuestra capa de lgica de negocio ya que nuestros mtodos no esperan que el original ProductID valor a pasar pulg Por lo tanto, como lo hemos hecho en los tutoriales anteriores, tome un momento para eliminar esta asignacin de la propiedad de la sintaxis declarativa o, en su lugar, establecer el valor de esta propiedad a {0} . Despus de este cambio, el ObjectDataSource marcado 's declarativo debe tener el siguiente aspecto:
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" SelectMethod = "GetProducts" TypeName = "ProductsBLL" UpdateMethod = "UpdateProduct"> <UpdateParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="supplierID" Type="Int32" /> <asp:Parameter Name="discontinued" Type="Boolean" /> <asp:Parameter Name="productID" Type="Int32" /> </ UpdateParameters> </ Asp: ObjectDataSource>

Tenga en cuenta que la OldValuesParameterFormatString propiedad se ha eliminado y que no hay un parmetro en elUpdateParameters coleccin para cada uno de los parmetros de entrada que esperan nuestros UpdateProductsobrecarga. Mientras que el ObjectDataSource est configurado para actualizar slo un subconjunto de los valores del producto, elGridView actualmente muestra todos los productos de los campos. Tome un momento para editar el GridView de modo que:

Slo incluye el ProductName , SupplierName , CategoryName BoundField s y el interrumpidas CheckBoxField. El CategoryName y SupplierName campos aparezcan antes (a la izquierda de) el interrumpidas CheckBoxField. El CategoryName y SupplierName BoundField s ' HeaderText propiedad se establece en "Categora" y "Proveedor", respectivamente. Soporte de edicin est activado (consulte la edicin Activar casilla de verificacin en el GridView tag 's inteligente).

Despus de estos cambios, el diseo ser similar a la Figura 3, con el GridView sintaxis 's declarativo se muestra a continuacin.

Figura 3. Quitar los campos que no sean necesarios desde el GridView.


<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <Asp: BoundField DataField = "ProductName" HeaderText = "ProductName" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> </ Columns> </ Asp: GridView>

En este punto, el GridView 's de slo lectura comportamiento se ha completado. Al visualizar los datos, cada producto se representa como una fila en el GridView , mostrando el nombre del producto, categora, proveedor, y el estado suspendido.

Figura 4. El GridView de slo lectura de la interfaz se ha completado. Nota: Como se explica en Tutorial 16: Una visin general de Insercin, actualizacin y eliminacin de datos, es de vital importancia que el GridView 's el estado de vista est activado (por defecto). Si se establece el GridView 's EnableViewState propiedad a falso , se corre el riesgo de tener usuarios concurrentes sin querer borrar o editar registros. (Ver ADVERTENCIA: punto de concurrencia con ASP.NET 2.0 GridViews / DetailsView / FormViews que la edicin de apoyo y / o eliminar y cuya visin del Estado est deshabilitadopara ms informacin.)

Paso 3: Usar un DropDownList para la categora de Proveedor de edicin e interfaces


Recordemos que el ProductsRow objeto contiene CategoryID , CategoryName , IdProveedor y SupplierNamepropiedades, que constituyen la actual clave externa de los valores de ID en el los productos de las tablas y el correspondiente nombre de los valores de la categoras y proveedores tablas. El ProductRow 's CategoryID yIdProveedor pued e ser tanto leer y escribir, mientras que el CategoryName y SupplierName propiedades estn marcados de slo lectura. Debido a la condicin de slo lectura de la CategoryName y SupplierName propiedades, el correspondienteBoundField s han tenido su ReadOnly propiedad establecida en verdad , la prevencin de estos valores que se modifique cuando una fila est editado. A pesar de que puede establecer el ReadOnly propiedad falsos , haciendo que el CategoryName y SupplierName BoundField s como TextBox es durante la edicin, este enfoque dar lugar a una excepcin cuando el usuario intenta actualizar el producto ya que no hay UpdateProduct sobrecarga que toma enCategoryName y SupplierName entradas. De hecho, no queremos crear como una sobrecarga, por dos razones:

Los productos de la tabla no tiene SupplierName o CategoryName campos, pero IdProveedor y CategoryID .Por lo tanto, queremos que nuestro mtodo para pasar los valores de ID en particular no, sus valores de las tablas de bsqueda. Requiere que el usuario escriba el nombre del proveedor o de una categora no es la ideal, ya que requiere que el usuario conozca las categoras disponibles y los proveedores y su ortografa correcta.

El proveedor y los campos de categora debe mostrar la categora y los nombres de los proveedores, cuando en modo de slo lectura (como lo hace ahora) y una lista desplegable de opciones de aplicacin cuando se est editando. Uso de una lista desplegable, el usuario final puede ver rpidamente cules son las categoras y los proveedores estn disponibles para elegir entre ms fcilmente y puede hacer su seleccin. Para proporcionar este comportamiento, tenemos que convertir el SupplierName y CategoryName BoundField s enTemplateField s cuya ItemTemplate emite la SupplierName y CategoryName valores y cuya EditItemTemplate utiliza un DropDownList de control a la lista de las categoras disponibles y proveedores.

Adicin de las categoras y DropDownLists Proveedores


Comience por la conversin de la SupplierName y CategoryName BoundField s en TemplateField s haciendo clic en elEditar columnas enlace desde el GridView tag 's inteligente, seleccionando el BoundField de la lista en la parte inferior izquierda, y haga clic en el Convertir este campo en un TemplateField enlace. El proceso de conversin se crear unTemplateField tanto con un ItemTemplate y un EditItemTemplate , como se muestra en la sintaxis declarativa a continuacin:
<asp:TemplateField HeaderText="Category" SortExpression="CategoryName"> <EditItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Eval ("NombreCategora") %>'></ asp: Label> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("NombreCategora") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Desde el BoundField se ha marcado como de slo lectura, tanto en el ItemTemplate y EditItemTemplate contiene unaetiqueta de control Web cuyo texto la propiedad est vinculada al campo de datos aplicable ( CategoryName , en la sintaxis ms arriba). Tenemos que modificar el EditItemTemplate , en sustitucin de la etiqueta de control Web con unDropDownList control. Como hemos visto en tutoriales anteriores, la plantilla puede ser editado por el diseador o directamente de la sintaxis declarativa. Para editar a travs del diseo, haga clic en el Editar plantillas de enlace desde el GridView tag 's inteligente y decide trabajar con la categora de campo de EditItemTemplate . Quite la etiqueta de control Web y reemplazarlo con un DropDownList de control, el establecimiento de la DropDownList 's ID propiedad de las categoras .

Figura 5. Quitar el cuadro de texto y agregar un DropDownList a la EditItemTemplate. A continuacin necesita llenar el DropDownList con las categoras disponibles. Haga clic en el Elegir origen de datosenlace de la DropDownList tag 's inteligentes y la opcin de crear un nuevo ObjectDataSource llamadoCategoriesDataSource .

Figura 6. Crear un nuevo control ObjectDataSource llamado CategoriesDataSource. Para tener esta ObjectDataSource retorno de todas las categoras, se unen a la CategoriesBLL clase GetCategories ()mtodo.

Figura 7. Obligar a la ObjectDataSource para GetCategories la CategoriesBLL () del mtodo.

Por ltimo, configure el DropDownList ajustes 's de modo que el CategoryName campo se muestra en cadaDropDownList ListItem con el CategoryID de campo se utiliza como valor.

Figura 8. Que el campo CategoryName en pantalla y el CategoryID se utiliza como valor. Despus de realizar estos cambios, el marcado declarativo para la EditItemTemplate en el CategoryNameTemplateField incluir tanto un DropDownList y un ObjectDataSource :
<asp:TemplateField HeaderText="Category" SortExpression="CategoryName"> <EditItemTemplate> <Asp: DropDownList ID = "Categoras" runat = "server" DataSourceID = "CategoriesDataSource" DataTextField = "CategoryName" DataValueField = "CategoryID"> </ Asp: DropDownList> <Asp: ObjectDataSource ID = "CategoriesDataSource" runat = "server" OldValuesParameterFormatString = "original_ {0}" SelectMethod = "GetCategories" TypeName = "CategoriesBLL"> </ Asp: ObjectDataSource> </ EditItemTemplate> <ItemTemplate> <Asp: ID Label = "Label1" runat = "server" Texto ='<%# Bind ("NombreCategora") %>'></ asp: Label> </ ItemTemplate> </ Asp: TemplateField>

Nota: El DropDownList en el EditItemTemplate debe tener habilitada su estado de vista. Pronto se sumar de enlace de datos de sintaxis para el DropDownList sintaxis 's declarativa y de enlace de datos comandos como Eval () y Bind () slo puede aparecer en los controles que el estado de vista est habilitado.

Repita estos pasos para agregar un DropDownList llamado Proveedores de la SupplierName TemplateField 'sEditItemTemplate . Esto supondr la adicin de un DropDownList a la EditItemTemplate y la creacin de otroObjectDataSource . Los proveedores DropDownList 's ObjectDataSource , sin embargo, se debe configurar para invocar la SuppliersBLL clase GetSuppliers () mtodo. Adems, configurar los proveedores DropDownList para mostrar el CompanyName campo y el uso de la IdProveedor campo como el valor de su ListItem s. Despus de aadir el DropDownList s de las dos EditItemTemplate s, la carga de la pgina en un navegador y haga clic en el Editar botn para el producto del chef Anton condimento de Cajun. Como muestra la Figura 9 muestra, la categora del producto y el proveedor de las columnas se representan como listas desplegables que contienen las categoras disponibles y los proveedores para elegir. Sin embargo, tenga en cuenta que el primero los elementos de ambas listas desplegables se seleccionan por defecto (como la categora de Bebidas y lquidos exticos como el proveedor), a pesar de Cajun del chef Anton condimento es un condimento suministrada por New Orleans Cajun Delicias.

Figura 9. El primer elemento de la lista desplegable est seleccionada por defecto. Adems, si hace clic en Actualizar , usted encontrar que el producto es CategoryID y IdProveedor valores se establecen en NULL . Ambos de estos comportamientos no deseados se deben a que el DropDownList s en elEditItemTemplate s no estn vinculados a los campos de datos a partir de los datos del producto subyacente.

Enlazar el DropDownLists a los campos de datos CategoryID y IdProveedor


Con el fin de tener la categora de producto editado y proveedor listas desplegables establecen en los valores adecuados y que estos valores enviados de vuelta a la BLL

es UpdateProduct mtodo al hacer clic en Actualizar , tenemos que obligar a la DropDownList s ' SelectedValue propiedades a la CategoryID y IdProveedor campos de datos utilizando dos vas de enlace de datos. Para lograr esto con la Categoras DropDownList , puede agregarSelectedValue ='<%# Bind ("CategoryID")%> ' directamente a la sintaxis declarativa. Alternativamente, se puede establecer el DropDownList 's enlaces de datos mediante la edicin de la plantilla a travs del diseo y haga clic en el Editar DataBindings enlace desde el DropDownList 's etiqueta inteligente. A continuacin, indican que el SelectedValue propiedad debe estar vinculado a la CategoryID campo utilizando dos vas de enlace de datos (ver Figura 10). Repita el proceso sea declarativo o el Diseador de obligar a la IdProveedor campo de datos alProveedores DropDownList .

Figura 10. Obligar a la CategoryID a la propiedad del DropDownList SelectedValue utilizando dos vas de enlace de datos. Una vez que los enlaces se han aplicado a la SelectedValue propiedades de los dos DropDownList s, la categora del producto editado y columnas proveedor por defecto a los valores del producto actual. Al hacer clic en Actualizar , elCategoryID y IdProveedor valores del elemento de lista desplegable seleccionado se pasa a la UpdateProductmtodo. La figura 11 muestra el tutorial despus de las declaraciones de enlace de datos se han agregado, nota cmo el desplegable seleccionado elementos de la lista de Cajun del chef Anton condimento condimentos correctamente y delicias de Nueva Orleans Cajun.

Figura 11. Categora actual del producto editado y los valores de los proveedores son seleccionados por defecto.

Tratamiento de valores NULL


El CategoryID y IdProveedor columnas de la Productos de mesa puede ser NULL , pero el DropDownList s en elEditItemTemplate s no incluyen un elemento de la lista para representar a un NULL el valor. Esto tiene dos consecuencias:

Usuario no puede utilizar nuestra interfaz para cambiar de categora de un producto o proveedor de un no-NULL a un valor NULL uno. Si un producto tiene un NULL CategoryID o IdProveedor , haga clic en el Editar botn tendr como resultado una excepcin. Esto es porque el nulo valor devuelto por CategoryID (o IdProveedor ) en el Bind () declaracin no se asigna a un valor en el DropDownList (el DropDownList produce una excepcin cuando su SelectedValuepropiedad se establece en un valor no en su coleccin de elementos de la lista ).

A fin de apoyar NULL CategoryID y IdProveedor valores, tenemos que aadir otro ListItem a cada DropDownListpara representar el valor NULL valor. En Tutorial 7: Maestro / Detalle de filtrado con un DropDownList , vimos cmo agregar un adicional de ListItem a un enlace de datos DropDownList , que implic la colocacin de DropDownList 'sAppendDataBoundItems propiedad real y agregar manualmente los adicionales ListItem . En ese tutorial anterior, sin embargo, hemos aadido un ListItem con un valor de -1 . La lgica de enlace de datos en ASP.NET, sin embargo, se convertir automticamente en una cadena en blanco a un NULL el valor y viceversa. Por lo tanto, para este tutorial, queremos que el ListItem 's valor a una cadena vaca. Comience por establecer dos DropDownList s ' AppendDataBoundItems propiedad real . A continuacin, agregue elNULL ListItem mediante la adicin de las siguientes <asp:ListItem> elemento a cada DropDownList para que el marcado declarativo se parece a lo siguiente:

<Asp: DropDownList ID = "Categoras" runat = "server" DataSourceID = "CategoriesDataSource" DataTextField = "CategoryName" DataValueField = "CategoryID" SelectedValue ='<%# Bind ("CategoryID")%> ' AppendDataBoundItems = "True"> <asp:ListItem value=""> (Ninguno) </ asp: ListItem> </ Asp: DropDownList>

He optado por utilizar "(ninguno)" como el texto de este valor ListItem , pero se puede cambiar para ser tambin una cadena en blanco si lo desea. Nota: Como vimos en el Tutorial 7: Maestro / Detalle de filtrado con un DropDownList , ListItem s se puede agregar a un DropDownList mediante el diseador, haga clic en el DropDownList 's elementos de la propiedad en la ventana de Propiedades (que muestra la ListItem Editor de la coleccin) . Sin embargo, asegrese de agregar el NULL ListItem para este tutorial a travs de la sintaxis declarativa. Si utiliza el ListItem Editor de la coleccin, la sintaxis declarativa generado omitir el valor ajuste por completo cuando se asigna una cadena en blanco, la creacin de marcado declarativo como<asp:ListItem> (Ninguno) </ asp: ListItem> . Si bien esto puede parecer inofensiva, la falta de valorhace que el DropDownList para utilizar el texto valor de la propiedad en su lugar. Eso significa que si esta NULL ListItem est seleccionado, el valor "(ninguno)" se intentar que se asignar a la CategoryID , lo que resultar en una excepcin. Estableciendo explcitamente value = "" , un NULL el valor ser asignado a CategoryID cuando el NULL ListItem est seleccionado. Repita estos pasos para los Proveedores DropDownList . Con este adicional ListItem , la interfaz de edicin Ahora puede asignar NULL a los valores de un Producto CategoryIDy IdProveedor campos, como se muestra en la Figura 12.

Figura 12. Seleccionar (Ninguno) para asignar un valor NULL para la categora de un producto o proveedor.

Paso 4: Uso de componentes RadioButton para el estado interrumpidas


En la actualidad, los productos discontinuados campo de datos se expresa con un CheckBoxField , que representa una casilla de verificacin desactivada para las filas de slo lectura y una casilla de verificacin habilitado para la fila que est siendo editada. Aunque esta interfaz de usuario es a menudo adecuada, podemos personalizar si es necesario utilizar un TemplateField . Para este tutorial, vamos a cambiar la CheckBoxField en un TemplateField que utiliza unRadioButtonList de control con dos opciones, "Activo" y "interrumpidas", de la cual el usuario puede especificar que el producto est descatalogado valor. Comience por la conversin de la interrumpidas CheckBoxField en un TemplateField , lo que crear un TemplateFieldcon un ItemTemplate y EditItemTemplate . Ambos modelos incluyen un CheckBox con su Chequeado propiedad ligada a la interrumpidas campo de datos, la nica diferencia entre los dos es que el ItemTemplate 's CheckBox 'sActivado propiedad est establecida en falso . Vuelva a colocar el CheckBox , tanto en el ItemTemplate y EditItemTemplate con un RadioButtonList de control, el establecimiento de los RadioButtonList s ' ID propiedades DiscontinuedChoice . A continuacin, indican que elRadioButtonList s que contienen cada uno dos botones, uno llamado "activo" con un valor de "falsas" y una etiqueta "interrumpidas" con un valor de "True". Para lograr esto, usted puede entrar en el <asp:ListItem> elementos directamente a travs de la sintaxis declarativa o utilizar el ListItem Editor de la coleccin de la diseadora. La figura 13 muestra el ListItem Editor de la coleccin despus de las dos opciones de botn de radio se han especificado.

Figura 13. Aadir "Activo" y opciones "interrumpidas" al RadioButtonList.

Desde el RadioButtonList en el ItemTemplate no debe ser editable, establezca su Activado propiedad a falso , dejando a los habilitados de propiedad de verdad (por defecto) para los RadioButtonList en el EditItemTemplate .Esto har que los botones de radio en la fila no editados como de slo lectura, pero permitir al usuario cambiar elRadioButton los valores de la fila editada. Todava tenemos que asignar el RadioButtonList controles " SelectedValue propiedades de manera que el botn de radio se selecciona basndose en el producto descatalogado campo de datos. Al igual que con el DropDownList s examin anteriormente en este tutorial, esta sintaxis de enlace de datos se pueden aadir directamente en el marcado declarativo o por medio de la edicin DataBindings enlace en el RadioButtonList s 'etiquetas inteligentes. Despus de agregar los dos RadioButtonList s y su configuracin, el interrumpidas TemplateField marcado 's declarativo debe tener el siguiente aspecto:
<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued"> <ItemTemplate> <Asp: RadioButtonList ID = "DiscontinuedChoice" runat = "server" Enabled = "false" SelectedValue ='<%# Bind ("interrumpidas")%> '> <asp:ListItem Value="False"> activo </ asp: ListItem> <asp:ListItem value="true"> interrumpidas </ asp: ListItem> </ Asp: RadioButtonList> </ ItemTemplate> <EditItemTemplate> <Asp: RadioButtonList ID = "DiscontinuedChoice" runat = "server" SelectedValue ='<%# Bind ("interrumpidas")%> '> <asp:ListItem Value="False"> activo </ asp: ListItem> <asp:ListItem value="true"> interrumpidas </ asp: ListItem> </ Asp: RadioButtonList> </ EditItemTemplate> </ Asp: TemplateField>

Con estos cambios, los descatalogados columna se ha transformado de una lista de casillas de verificacin a una lista de pares de botones de opcin (ver figura 14). Al editar un producto, el botn de radio est seleccionado y el estado suspendi el producto se puede actualizar seleccionando el botn de radio y haciendo clic en Actualizar .

Figura 14. Las casillas de verificacin interrumpidas han sido sustituidos por pares botn de radio. Nota: Dado que el interrumpidas en la columna de productos de base de datos no puede tener NULLvalores, no tiene que preocuparse acerca de la captura NULL informacin en la interfaz. Sin embargo, siinterrumpidas columna puede contener NULL los valores que nos gustara aadir un botn de radio tercero en la lista con su valor establecido en una cadena vaca ( valor = "" ), al igual que con la categora y el proveedor DropDownList s.

Conclusin
Mientras que el BoundField y CheckBoxField automticamente que de slo lectura, la edicin y la insercin de las interfaces, que carecen de la capacidad de personalizacin. A menudo, sin embargo, tendremos que personalizar la interfaz de edicin o insercin, tal vez aadiendo controles de validacin (como vimos en el tutorial anterior) o mediante la personalizacin de la interfaz de usuario de recopilacin de datos (como hemos visto en este tutorial).Personalizacin de la interfaz con un TemplateField se puede resumir en los siguientes pasos:
1. Aadir un TemplateField o convertir un BoundField o CheckBoxField en

un TemplateField . 2. Enriquecer la interfaz, segn sea necesario. 3. Se unen los campos de datos apropiados a los controles Web que acaba de agregar el uso de dos vas de enlace de datos. Adems de utilizar el incorporado en los controles ASP.NET Web, tambin puede personalizar las plantillas de unTemplateField con la costumbre, compilado controles de servidor y controles de usuario.

EN ESTE CAPITULO SALIO: Error de servidor en '/'


Application.
SIN TUTORIAL NUMERO: 21 CS | Visual C#

Tutorial 22: Adicin del lado del cliente la confirmacin al eliminar


Scott Mitchell 04 2007 Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) En las interfaces que hemos creado hasta ahora, un usuario puede accidentalmente eliminar los datos haciendo clic en el Eliminar botn cuando la intencin de hacer clic en el Editar botn. En este tutorial, vamos a aadir un cuadro de confirmacin del lado del cliente de dilogo que aparece cuando el Eliminar botn es pulsado. (7 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 22 (Visual C #) Introduccin Paso 1: Creacin de un FormView que admite la eliminacin Paso 2: Llamar al confirmar (cadena) La funcin del evento onclick del lado del cliente de un botn Eliminar Paso 3: Configuracin de la Propiedad OnClientClick para el botn Eliminar en un CommandField Con TemplateFields Conclusin

Introduccin
A travs de los tutoriales de varios aos, hemos visto cmo utilizar la arquitectura de aplicaciones, ObjectDataSource , y los controles Web de datos en conjunto para proporcionar la insercin, edicin y eliminacin de las capacidades. Las interfaces de borrar que hemos examinado hasta ahora han sido compuesta por un Eliminar botn que, cuando se hace clic, produce una devolucin de datos e invoca el ObjectDataSource 's Eliminar () mtodo. La Eliminar () mtodo se invoca el mtodo

de configuracin de la capa de lgica empresarial, que se propaga la llamada hasta la capa de acceso a datos, la emisin de la actual DELETE declaracin a la base de datos. Aunque esta interfaz de usuario permite a los visitantes para eliminar los registros a travs del GridView , DetailsViewo FormView control, carece de cualquier tipo de confirmacin cuando el usuario hace clic en el Eliminar botn. Si un usuario hace clic en el accidente Eliminar el botn cuando se pretende hacer clic en Editar , el registro se referan al da en vez sern borrados. Para evitar esto, en este tutorial, vamos a aadir un cuadro de confirmacin del lado del cliente de dilogo que aparece cuando el Eliminar botn es pulsado. El JavaScript confirmar ( cadena ) funcin muestra su parmetro de entrada como la cadena de texto dentro de un cuadro de dilogo modal que viene equipado con dos botones: Aceptar y Cancelar (ver Figura 1). La confirmacin (cadena ) devuelve un valor booleano, dependiendo de lo que se hace clic en el botn ( cierto , si el usuario hace clic enAceptar , y falsa , si el usuario hace clic en Cancelar ).

Figura 1. El JavaScript confirmar ( cadena ) muestra un mtodo modal, del lado del cliente cuadro de mensaje. Durante una presentacin forma, si un valor de falso se devuelve desde un controlador de eventos del lado del cliente, el envo del formulario se ha cancelado. Con esta funcin, podemos tener la Eliminacin del botn del lado del clienteonclick controlador de eventos devuelve el valor de una llamada a confirmar ("Est seguro que desea eliminar este producto?") . Si el usuario hace clic en Cancelar , confirmar ( cadena ) devolver false, lo que provoca el envo del formulario para cancelar. Sin devolucin, el producto cuya Eliminar botn se hizo clic no se eliminarn. Sin embargo, si el usuario hace clic en Aceptar en el cuadro de dilogo de confirmacin, la devolucin de datos seguir su curso y el producto sern eliminados. Consulte Uso de JavaScript confirmar () del mtodo de control de envo de formularios para obtener ms informacin sobre esta tcnica. Aadir la necesaria script de cliente difiere ligeramente, si el uso de plantillas, de cuando se utiliza un CommandField .Por lo tanto, en este tutorial, vamos a ver tanto un FormView y GridView ejemplo. Nota: Con el lado del cliente tcnicas de confirmacin, como los que en este tutorial, se supone que los usuarios lo visiten con navegadores que soportan JavaScript y que tienen el cdigo JavaScript habilitado.Si cualquiera de estos supuestos no se aplica a un usuario en particular, haga clic en el Eliminar botn inmediatamente har una devolucin de datos (no se muestra un mensaje de confirmacin).

Paso 1: Creacin de un FormView que admite la eliminacin


Comience por la adicin de un FormView a la pgina de ConfirmationOnDelete.aspx en la carpeta EditInsertDelete, que vincule a un nuevo ObjectDataSource que tira de la informacin del producto a travs de la ProductsBLL claseGetProducts () mtodo. Adems, configurar el ObjectDataSource , por lo que el ProductsBLL clase DeleteProduct (ProductID) mtodo se asigna a la ObjectDataSource 's Eliminar () mtodo. Asegrese de que la INSERTAR yACTUALIZAR desplegable pestaas 'listas se establecen en (Ninguno) . Por ltimo, compruebe la paginacin Activarcasilla de verificacin en el FormView tag 's inteligente. Despus de estos pasos, el nuevo ObjectDataSource marcado 's declarativa se ver como la siguiente:
<Asp: ObjectDataSource ID = "ObjectDataSource1" runat = "server" DeleteMethod = "DeleteProduct" OldValuesParameterFormatString = "original_ {0}" SelectMethod = "GetProducts" TypeName = "ProductsBLL"> <DeleteParameters> <asp:Parameter Name="productID" Type="Int32" /> </ DeleteParameters> </ Asp: ObjectDataSource>

Como en los ejemplos del pasado que no utilizaron la concurrencia optimista, tome un momento para limpiar elObjectDataSource 's OldValuesParameterFormatString propiedad. Ya que se ha unido a un ObjectDataSource de control que slo es compatible con la eliminacin, el FormView 'sItemTemplate ofrece slo la Eliminacin de la falta de botones Nuevo y actualizacin de los botones. El FormViewmarcado 's declarativa, sin embargo, incluye una superflua EditItemTemplate y InsertItemTemplate , que se puede quitar. Tmese un momento para personalizar el ItemTemplate , para que muestre slo un subconjunto de los datos del producto campos. He configurado la mina para mostrar el nombre del producto en un <h3> ttulo por encima de su proveedor y los nombres de categora (junto con el Eliminar botn).
<Asp: FormView ID = "FormView1" AllowPaging = "True" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" runat = "server"> <ItemTemplate> <h3> <i> <% # Eval ("ProductName")%> </ i> </ h3> <b> Categora: </ b> <Asp: Label = ID "CategoryNameLabel" runat = "server" Texto ='<%# Eval ("NombreCategora")%> '> </ Asp: Label> <br /> <b> Proveedor: </ b> <Asp: Label = ID "SupplierNameLabel" runat = "server" Texto ='<%# Eval ("SupplierName")%> '> </ Asp: Label> <br /> <Asp: LinkButton ID = "DeleteButton" runat = "server" CausesValidation = "false" CommandName = "Delete" Text = "Eliminar"> </ Asp: LinkButton> </ ItemTemplate> </ Asp: FormView>

Con estos cambios, tenemos una pgina web completamente funcional que permite al usuario alternar entre los productos uno a la vez, con la capacidad de eliminar un producto con slo hacer clic en el Eliminar botn. La figura 2 muestra una captura de pantalla de nuestro progreso hasta ahora cuando se ve a travs de un navegador.

Figura 2. El FormView muestra informacin sobre un solo producto.

Paso 2: Llamar al confirmar ( cadena ) La funcin del evento onclick del lado del cliente de un botn de Eliminar
Con el FormView creado, el ltimo paso es configurar el Eliminar botn de tal manera que cuando se hace clic en l por el visitante, el cdigo JavaScript confirmar ( cadena ) se invoca la funcin. Adicin de script de cliente para el lado del cliente onclick caso de un botn , LinkButton o ImageButton se puede lograr a travs del uso de la propiedad OnClientClick , que es nuevo en ASP.NET 2.0. Porque queremos tener el valor de la confirmacin ( cadena ) devuelve la funcin, slo establece esta propiedad en: volver confirm ('Est seguro que desea eliminar este producto?'); Despus de este cambio, el Eliminar LinkButton sintaxis 's declarativa debera ser algo como lo siguiente:
<Asp: LinkButton ID = "DeleteButton" runat = "server" CausesValidation = "false" CommandName = "Delete" Text = "Eliminar" OnClientClick = "return confirm ('Est seguro que desea eliminar este producto ?');"> </ Asp: LinkButton>

Eso es todo lo que hay que hacer! La Figura 3 muestra una captura de pantalla de esta confirmacin de la accin. Al hacer clic en el Eliminar botn abre el cuadro de dilogo de confirmacin. Si el usuario hace clic en Cancelar , se cancela la devolucin de datos y el producto no se elimina. Sin embargo, si el usuario hace clic en Aceptar , la devolucin de

datos contina y el ObjectDataSource 's Eliminar () es llamado, el que culmin en el registro de la base de ser eliminados. Nota: La cadena pas a confirmar ( cadena ) de JavaScript se delimita con apstrofes (en lugar de las comillas). En JavaScript, las cadenas se pueden delimitar con cualquier personaje. Utilizamos apstrofes aqu, para que los delimitadores de la cadena pas a confirmar ( cadena ) no introducen una ambigedad con los delimitadores utilizados para la OnClientClick valor de la propiedad.

Figura 3. La confirmacin se muestra ahora al hacer clic en el botn Eliminar.

Paso 3: Configuracin de la Propiedad OnClientClick para el botn Eliminar en un CommandField


Cuando se trabaja con un botn , LinkButton o ImageButton directamente en una plantilla, un cuadro de dilogo de confirmacin se puede asociar con ella slo por la configuracin de su OnClientClick propiedad para devolver los resultados de la JavaScript confirmar ( cadena ) la funcin. Sin embargo, el CommandField , que agrega un campo deEliminar botones a un GridView o DetailsView , no tiene un OnClientClick propiedades que pueden establecerse mediante declaracin. En su lugar, debe hacer referencia a la programacin Eliminar botn en el GridView oDetailsView 's apropiado DataBound controlador de eventos, y luego definir su OnClientClick propiedad all. Nota: Al establecer el Eliminar botn OnClientClick propiedad en la correspondiente DataBoundcontrolador de eventos, tenemos acceso a los datos que tena que el registro actual. Esto significa que se puede extender el mensaje de confirmacin para incluir detalles sobre el registro en particular, como por ejemplo, "Est seguro que desea eliminar el producto Chai?" Personalizacin, tambin es posible en las plantillas de enlace de datos utilizando la sintaxis. Para practicar el ajuste OnClientClick propiedad para el Eliminar botn (s) en un CommandField , vamos a agregar unGridView a la pgina. Configurar este GridView para utilizar el mismo ObjectDataSource control que el FormViewutiliza. Por otra parte, limitar el GridView 's BoundField s para incluir slo el

nombre del producto, categora, y el proveedor. Por ltimo, compruebe el Habilitar eliminacin de la casilla de verificacin GridView tag 's inteligente. Esto agregar una CommandField a la GridView 's columnas de recogida, con su ShowDeleteButton propiedad establecida en verdad . Despus de realizar estos cambios, el GridView marcado declarativo 's deben tener el siguiente aspecto:
<Asp: GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1"> <columnas> <asp:CommandField ShowDeleteButton="True" /> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> </ Columns> </ Asp: GridView>

El CommandField contiene un nico Eliminar LinkButton ejemplo que se puede acceder mediante programacin a partir de la GridView 's RowDataBound controlador de eventos. Tan pronto como se le hace referencia, se puede establecer su OnClientClick propiedad en consecuencia. Crear un controlador de eventos para el RowDataBoundevento mediante el siguiente cdigo:
protected void GridView1_RowDataBound (object sender, GridViewRowEventArgs e) { si (== e.Row.RowType DataControlRowType.DataRow) { / / Eliminar la referencia del LinkButton LinkButton db = (LinkButton) e.Row.Cells [0] Controles [0].; / / Obtener informacin sobre el producto vinculado a la fila Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) . e.Row.DataItem) la fila; db.OnClientClick = String.Format ( "Return confirm ('Est seguro que desea eliminar el {0} producto ?');", product.ProductName.Replace ("'", @ "\'")); } }

Este controlador de eventos trabaja con las lneas de datos (los que tienen el Eliminar botn) y comienza con la referencia a la programacin Eliminar botn. En general, utilice el siguiente patrn:
ButtonType obj = (ButtonType) e.Row.Cells [commandFieldIndex] Controles [controlIndex].;

ButtonType es el tipo de botn que se utiliza por el CommandField : botn , LinkButton o ImageButton . Por defecto, el CommandField utiliza LinkButton s, pero esto puede ser personalizado a travs de

la CommandField 'spropiedad ButtonType . El commandFieldIndex es el ndice ordinal de la CommandField en el GridView 's columnasde recogida, mientras que el controlIndex es el ndice de la Eliminacin de botn dentro de la CommandField 'scontroles coleccin. El controlIndex valor depende de la posicin en relacin con otros botones en el el botn deCommandField . Por ejemplo, si el botn slo se muestra en la CommandField es el Eliminar botn, se utiliza un ndice de 0. Sin embargo, si hay una edicin que precede al botn Eliminar botn, se utiliza un ndice de 2. La razn se utiliza un ndice de 2 es que los dos controles se agregan por el CommandField antes de que el Eliminar botn: laEdicin de botn, y un LiteralControl que se utiliza para aadir un poco de espacio entre la edicin y Eliminarbotones. Para nuestro ejemplo particular, la CommandField utiliza LinkButton s y, de ser el campo ms a la izquierda, tiene uncommandFieldIndex de 0. Porque no hay otros botones, pero el Eliminar botn de la CommandField , se utiliza uncontrolIndex de 0. Despus de hacer referencia a la Borrar botn en el CommandField , el prximo coger informacin sobre el producto ligado a la actual GridView fila. Finalmente, se establece el Eliminar botn OnClientClick propiedad a la adecuada JavaScript, el cual incluye el nombre del producto. Debido a que la cadena de JavaScript pas a confirmar ( cadena )es la funcin delimitada utilizar los pronombres, hay que escapar a toda apstrofes que aparecen en el nombre del producto. En particular, los apstrofes en el nombre del producto se escap con " \ ' ". Con estos cambios completa, hacer clic en un Eliminar botn en el GridView muestra un cuadro de dilogo de confirmacin personalizada (ver Figura 4). Al igual que con el mensaje de confirmacin de la FormView , si el usuario hace clic en Cancelar , se cancela la devolucin de datos, lo que impide la eliminacin de ocurrir. Nota: Esta tcnica tambin se puede utilizar para acceder a la Eliminar botn de programacin en elCommandField en un DetailsView . Para el DetailsView , sin embargo, se creara un controlador de eventos para el DataBound caso, debido a que el DetailsView no tiene RowDataBound evento.

Figura 4. Al hacer clic en el botn Eliminar GridView muestra un cuadro de dilogo de confirmacin personalizado.

Utilizando TemplateFields
Una de las desventajas de la CommandField es que los botones se accede mediante la indexacin, y el objeto resultante se debe convertir en el tipo de botn adecuado ( botones , LinkButton o ImageButton ). El uso de "nmeros mgicos" y los tipos en el cdigo invita a los problemas que no pueden ser descubiertos hasta que el tiempo de ejecucin. Por ejemplo, si usted (u otro desarrollador) aadir nuevos botones a la CommandField en algn momento en el futuro (como una edicin el botn) o cambiar el ButtonType propiedad, el cdigo existente seguir compilar sin errores, pero visitando la pgina de la causa puede una excepcin o un comportamiento inesperado, dependiendo de cmo el cdigo fue escrito y lo que se han realizado cambios. Un enfoque alternativo consiste en convertir el GridView y DetailsView 's CommandField s en TemplateField s. Esto generar un TemplateField con un ItemTemplate que tiene un LinkButton (o botn o ImageButton ) a cada botn en el CommandField . Estos botones ' OnClientClick propiedades pueden asignarse de forma declarativa, como hemos visto con el FormView , o puede ser visitada en la programacin adecuada DataBound controlador de eventos utilizando el siguiente patrn:
ButtonType obj = (ButtonType) e.Row.FindControl ("controlID");

Aqu, controlID es el valor del botn de ID de propiedad. Aunque este patrn todava requiere un tipo de hard-coded para el elenco, que elimina la necesidad de indexacin que permite el diseo de cambiar, sin dar lugar a un error en tiempo de ejecucin.

Conclusin

El JavaScript confirmar ( cadena ) la funcin es una tcnica usada comnmente para controlar la forma de presentacin de flujo de trabajo. Cuando se ejecuta, la funcin muestra una modal, del lado del cliente el cuadro de dilogo que incluye dos botones: Aceptar y Cancelar . Si el usuario hace clic en Aceptar , la confirmacin ( cadena ) devuelveverdadero , haciendo clic en Cancelar vuelve falsa . Esta funcionalidad, junto con el comportamiento de un navegador para cancelar el envo del formulario, si un controlador de eventos durante el proceso de presentacin de declaracionesfalsas se pueden utilizar para mostrar un mensaje de confirmacin al eliminar un registro. La confirmacin ( cadena ) funcin puede ser asociada a un botn de control del lado del cliente Web onclickcontrolador de eventos a travs del control OnClientClick propiedad. Cuando se trabaja con un Eliminar botn en una plantilla, ya sea en uno de los FormView plantillas 's, o en un TemplateField en el DetailsView o GridView , esta propiedad se puede establecer mediante declaracin o mediante programacin, como hemos visto en este tutorial.

Tutorial 23: Limitacin de modificacin de datos funcionalidad basada en el usuario


Scott Mitchell 04 2007 Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) En una aplicacin Web que permite a los usuarios editar los datos, diferentes cuentas de usuario pueden tener diferentes privilegios de edicin de datos. En este tutorial, vamos a estudiar la manera de ajustar de forma dinmica la capacidad de modificacin de datos basado en el usuario que visita. (21 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 23 (Visual C #) Introduccin Paso 1: Permitir a los usuarios especificar su derechos de acceso Paso 2: Agregar un control DetailsView Paso 3: muestra slo la informacin del proveedor seleccionado en el Paso 4: Listado de los productos de los proveedores en un GridView editable Paso 5: Edicin No permitir para productos descatalogados cuando "Mostrar / editar todos los proveedores "no est seleccionado Comprobacin de los derechos de acceso en el negocio de la capa de lgica Conclusin

Introduccin
Una serie de aplicaciones web de soporte de cuentas de usuario y ofrecer opciones diferentes, informes, y la funcionalidad basada en el usuario conectado. Por ejemplo, con nuestros tutoriales, que puede ser que desee para que los usuarios de las empresas proveedoras para iniciar sesin en el sitio y actualizar la informacin general sobre sus productos, su nombre y la cantidad por unidad, tal vez, junto con informacin de los proveedores, como su nombre de la empresa , direccin, informacin de la persona de contacto, y as sucesivamente. Adems, podramos incluir algunas cuentas de usuario para las personas de nuestra empresa, para que puedan ingresar y actualizar la informacin de producto como unidades en stock, nivel de pedido, y as sucesivamente. Nuestra aplicacin Web tambin podra permitir a los usuarios annimos para visitar (personas que no han iniciado la sesin), sino que los lmites para que slo vean los datos. Con un sistema de cuenta de usuario en su lugar, nos gustara que los controles web de datos en nuestras pginas ASP.NET para ofrecer al insertar, editar y eliminar las capacidades adecuadas para el actual usuario registrado. En este tutorial, vamos a estudiar la manera de ajustar de forma dinmica la capacidad de modificacin de datos basado en el usuario que visita. En particular, vamos a crear una pgina que muestra informacin de los proveedores en un editable DetailsView con un GridView que las listas de los productos suministrados por el proveedor. Si el usuario visita la pgina de nuestra empresa, pueden ver la informacin del proveedor, modificar su direccin, y editar la informacin de cualquier producto proporcionado por el proveedor. Sin embargo, si el usuario es de una empresa particular, que pueden ver y editar su informacin de la direccin propia y slo pueden editar sus productos que no han sido marcados como interrumpidas.

Figura 1. Un usuario de nuestra compaa puede editar la informacin del proveedor.

Figura 2. Un usuario de un determinado proveedor puede ver y editar la informacin de que slo proveedor. Vamos a empezar! Nota: El sistema de suscripciones de ASP.NET 2.0 proporciona una plataforma estandarizada y extensible para la creacin, gestin y validacin de cuentas de usuario. Debido a que un examen del sistema de afiliacin est fuera del alcance de estos tutoriales, este tutorial en lugar de "falsificaciones" la adhesin al permitir que los visitantes annimos de elegir si son de un determinado proveedor o de nuestra empresa. (Para ms informacin sobre membresa, se refieren a mi membresa examen de ASP.NET 2.0 's, funciones y perfil serie de artculos.)

Paso 1: Permitir que los usuarios especifiquen sus derechos de acceso


En una aplicacin Web en el mundo real, la informacin de un usuario de la cuenta se incluyen si trabajaban para la empresa o de un proveedor en particular, y esta informacin sera accesible mediante programacin de nuestras pginas ASP.NET despus de que el usuario ha iniciado sesin en el sitio. Esta informacin puede ser capturada por el sistema de roles de ASP.NET 2.0, como informacin de la cuenta a nivel de usuario a travs del sistema de perfiles, oa travs de algunos medios personalizados. Debido a que el objetivo de este tutorial es para demostrar el ajuste de las capacidades de modificacin de datos basado en el usuario conectado, y no est pensado para mostrar la composicin, funciones y sistemas de perfiles de ASP.NET 2.0, vamos a utilizar un

mecanismo simple para determinar las capacidades para el usuario visita la pgina: unDropDownList desde donde el usuario puede indicar si debe ser capaz de ver y editar cualquier informacin del proveedor o, alternativamente, lo que la informacin del proveedor en particular se puede ver y editar. Si el usuario indica que se puede ver y editar toda la informacin del proveedor (por defecto), se puede enviar un mensaje a travs de todos los proveedores, editar la informacin del proveedor de direcciones y modificar el nombre y la cantidad por unidad de cualquier producto proporcionado por el proveedor seleccionado. Si el usuario indica que se puede ver y editar slo un proveedor en particular, sin embargo, slo pueden ver los detalles y los productos de dicho proveedor y uno puede actualizar slo el nombre y la cantidad por unidad de informacin para aquellos productos que no seinterrumpi. Nuestro primer paso en este tutorial, entonces, es la creacin de este DropDownList y rellenarla con los proveedores en el sistema. Abra la pgina UserLevelAccess.aspx en la carpeta EditInsertDelete, agregar un DropDownList cuya IDpropiedad se establece en los proveedores , y enlazar este DropDownList a un nuevo ObjectDataSource llamadoAllSuppliersDataSource .

Figura 3. Crear un nuevo llamado ObjectDataSource AllSuppliersDataSource. Porque queremos que este DropDownList para incluir a todos los proveedores, configurar el ObjectDataSource para invocar la SuppliersBLL clase GetSuppliers () mtodo. Asegrese tambin de que el ObjectDataSource 's Update ()mtodo se asigna a la SuppliersBLL clase UpdateSupplierAddress mtodo, ya que ObjectDataSource se utilizar tambin por el DetailsView se irn sumando en el paso 2. Despus de completar el Asistente para ObjectDataSource, siga los pasos de la configuracin de la ProveedoresDropDownList de tal forma que muestra

el CompanyName campo de datos y utiliza el IdProveedor campo de datos como el valor de cada ListItem .

Figura 4. Configurar el DropDownList proveedores a utilizar el CompanyName y campos de datos SupplierID. En este punto, el DropDownList se enumeran los nombres de empresas de los proveedores en la base de datos. Sin embargo, tambin debe incluir un "Show / Editar todos los proveedores" a la opcin DropDownList . Para lograr esto, el conjunto de proveedores DropDownList 's AppendDataBoundItems propiedad real y luego aadir un ListItem cuyaTexto caracterstica "Mostrar / Editar todos los proveedores" y cuyo valor es -1 . Esto se puede agregar directamente a travs del marcado declarativo o por el Diseador de ir a la ventana Propiedades y haga clic en los puntos suspensivos en el DropDownList 's elementos de la propiedad. Nota: Refirase a las de filtrado principal / detalle con un DropDownList tutorial para una discusin ms detallada sobre cmo agregar una "Seleccionar todo" a un elemento de enlace de datos DropDownList . Despus de la AppendDataBoundItems propiedad se ha establecido y el ListItem agreg, el DropDownList marcado 's declarativo debe tener el siguiente aspecto:
<Asp: DropDownList ID = "Proveedores" runat = "server" AppendDataBoundItems = "True" DataSourceID = "AllSuppliersDataSource" DataTextField = "CompanyName" DataValueField = "IdProveedor"> <asp:ListItem Value="-1"> Mostrar / Editar todos los proveedores </ asp: ListItem> </ Asp: DropDownList>

La Figura 5 muestra una captura de pantalla de nuestro progreso actual, vista a travs de un navegador.

Figura 5. El DropDownList Proveedores contiene una "Mostrar todo" ListItem, ms uno por cada proveedor. Porque queremos actualizar la interfaz de usuario inmediatamente despus de que el usuario ha cambiado su seleccin, establezca la Proveedores DropDownList 's AutoPostBack propiedad verdadera . En el paso 2, vamos a crear unDetailsView de control que se mostrar la informacin del proveedor (s), basado en el DropDownList de seleccin.Luego, en el paso 3, vamos a crear un controlador de eventos para este DropDownList 's SelectedIndexChanged caso, en el que vamos a aadir el cdigo que se une la informacin de los proveedores apropiados para el DetailsViewbasado en el proveedor seleccionado.

Paso 2: Agregar un control DetailsView

Vamos a usar un DetailsView para mostrar la informacin del proveedor. Para el usuario que puede ver y editar todos los proveedores, el DetailsView se admite la paginacin, que permite al usuario paso a travs del registro del proveedor una informacin a la vez. Si el usuario trabaja para un proveedor determinado, sin embargo, el DetailsViewmostrar slo la informacin del proveedor en particular y no incluyen una interfaz de paginacin. En cualquier caso, elDetailsView debe permitir al usuario editar la direccin del proveedor, de la ciudad, y los campos de pas. Aadir un DetailsView a la pgina debajo de la Proveedores DropDownList , establezca su identificacin de la propiedad de SupplierDetails , y se unen a la AllSuppliersDataSource ObjectDataSource creado en el paso anterior. A continuacin, compruebe la paginacin Activar y Habilitar edicin casillas de verificacin de la DetailsView tag 's inteligente. Nota: Si usted no ve una Habilitar edicin opcin en el DetailsView 's etiqueta inteligente, es porque no mapa del ObjectDataSource 's Update () mtodo para la SuppliersBLL clase UpdateSupplierAddressmtodo. Tmese un momento para volver atrs y hacer este cambio de configuracin, despus de que laedicin Habilitar opcin debera aparecer en el DetailsView tag 's inteligente. Debido a que el SuppliersBLL clase UpdateSupplierAddress mtodo slo acepta cuatro parmetros- supplierID ,direccin , ciudad y pas de modificar el DetailsView 's BoundField s, por lo que el CompanyName y TelfonoBoundField s son de slo lectura. Adems, quitar el IdProveedor BoundField por completo. Por ltimo, elAllSuppliersDataSource ObjectDataSource en la actualidad tiene su OldValuesParameterFormatString propiedad establecida en original_ {0} . Tmese un momento para eliminar este valor de la propiedad de la sintaxis declarativa del todo, o se establece en el valor predeterminado, que es {0} . Despus de configurar el SupplierDetails DetailsView y AllSuppliersDataSource ObjectDataSource , vamos a tener el marcado declarativo siguiente:
<Asp: ObjectDataSource ID = "AllSuppliersDataSource" runat = "server" SelectMethod = "GetSuppliers" TypeName = "SuppliersBLL" UpdateMethod = "UpdateSupplierAddress"> <UpdateParameters> <asp:Parameter Name="supplierID" Type="Int32" /> <asp:Parameter Name="address" tipo="String" /> <asp:Parameter Name="city" tipo="String" /> <asp:Parameter Name="country" tipo="String" /> </ UpdateParameters> </ Asp: ObjectDataSource> <Asp: DetailsView ID = "SupplierDetails" runat = "server" AllowPaging = "True" AutoGenerateRows = "false" DataKeyNames = "IdProveedor" DataSourceID = "AllSuppliersDataSource"> <Fields> <Asp: BoundField DataField = "CompanyName" HeaderText = "Compaa" ReadOnly = "True" SortExpression = "CompanyName" /> <Asp: BoundField DataField = "Direccin" HeaderText = "Direccin" SortExpression = "Direccin" /> <Asp: BoundField DataField = "Ciudad" HeaderText = "Ciudad" SortExpression = "Ciudad" /> <Asp: BoundField DataField = "Pas" HeaderText = "Pas" SortExpression = "Pas" />

<Asp: BoundField DataField = "Telfono" HeaderText = "Telfono" ReadOnly = "True" SortExpression = "Telfono" /> <asp:CommandField ShowEditButton="True" /> </ Campos> </ Asp: DetailsView>

En este punto, el DetailsView puede paginar a travs de la informacin y el proveedor seleccionado de direcciones puede ser actualizada, independientemente de la seleccin hecha en el Proveedores DropDownList (ver Figura 6).

Figura 6. Informacin del proveedor puede ser visto, y actualizada su direccin.

Paso 3: Visualizacin de la informacin slo es el proveedor seleccionado


Nuestra pgina actualmente muestra la informacin para todos los proveedores, independientemente de si un determinado proveedor ha sido seleccionado de proveedores DropDownList . Para mostrar slo la informacin de los proveedores para el proveedor seleccionado, hay que aadir otro ObjectDataSource a nuestra pgina, que recupera informacin acerca de un proveedor en particular.

Aadir un nuevo ObjectDataSource a la pgina, dndole el nombre SingleSupplierDataSource . Desde sus etiquetas inteligentes, haga clic en la configuracin de orgenes de datos de enlace y tienen que utilizar el SuppliersBLL claseGetSupplierBySupplierID (supplierID) mtodo. Al igual que con el AllSuppliersDataSource ObjectDataSource , tienen la SingleSupplierDataSource ObjectDataSource 's Update () mtodo asigna a la SuppliersBLL claseUpdateSupplierAddress mtodo.

Figura 7. Configurar el SingleSupplierDataSource ObjectDataSource para utilizar el GetSupplierBySupplierID (supplierID) mtodo. A continuacin, se le pedir que especifique el origen de los parmetros de la GetSupplierBySupplierID (supplierID)mtodo supplierID parmetro de entrada. Porque queremos mostrar la informacin para el proveedor seleccionado del DropDownList , utilice el Proveedores DropDownList 's SelectedValue propiedad como la fuente de los parmetros.

Figura 8. Utilice el DropDownList proveedores como fuente de parmetros supplierID. Incluso con esta segunda ObjectDataSource aadido, el DetailsView de control est configurado para utilizar siempre el AllSuppliersDataSource ObjectDataSource . Hay que agregar lgica para ajustar la fuente de datos utilizada por elDetailsView en funcin de los proveedores DropDownList elemento seleccionado. Para lograr esto, cree unSelectedIndexChanged controlador de eventos para los proveedores DropDownList . Esto se puede crear fcilmente haciendo doble clic en el DropDownList en el diseador. Este controlador de eventos debe determinar qu fuente de datos para utilizar y debe volver a enlazar los datos a la DetailsView . Esto se logra usando el siguiente cdigo:
protected void Suppliers_SelectedIndexChanged (object sender, EventArgs e) { if (Suppliers.SelectedValue == "1") { / / La opcin "Mostrar / Editar todos" ha seleccionado la opcin SupplierDetails.DataSourceID = "AllSuppliersDataSource"; / / Restablecer el ndice de la pgina para mostrar el primer registro SupplierDetails.PageIndex = 0; / / El usuario elegido un proveedor en particular SupplierDetails.DataSourceID = "SingleSupplierDataSource";

} ms

/ / Asegrese de que el DetailsView est en modo de slo lectura SupplierDetails.ChangeMode (DetailsViewMode.ReadOnly); / / Necesidad de "refrescar" el DetailsView SupplierDetails.DataBind ();

El controlador de eventos comienza con la determinacin de si la opcin "Mostrar / Editar todos los proveedores", se seleccion la opcin. Si lo fuera, se establece el SupplierDetails DetailsView 's DataSourceID aAllSuppliersDataSource y devuelve al usuario al primer registro en el conjunto de proveedores mediante el establecimiento de la PageIndex propiedad a 0 . Sin embargo, si el usuario ha seleccionado un proveedor en particular de la DropDownList , el DetailsView 's DataSourceID se asigna a SingleSuppliersDataSource . Independientemente de lo que la fuente de datos es usada, el SuppliersDetails modo se revierte de nuevo al modo de slo lectura y los datos de rebote a la DetailsView mediante una llamada a la SuppliersDetails control DataBind () mtodo. Con este controlador de eventos en el lugar, el DetailsView control ahora muestra el proveedor seleccionado, a menos que la opcin "Mostrar / Editar todos los proveedores", se seleccion la opcin, en cuyo caso todos los proveedores se pueden ver a travs de la interfaz de paginacin. La Figura 9 muestra la pgina con la opcin "Mostrar / Editar todos los proveedores" seleccionada, tenga en cuenta que la interfaz de paginacin est presente, lo que permite al usuario a visitar y actualizar cualquier proveedor. La figura 10 muestra la pgina con el proveedor seleccionado Ma Maison, la informacin slo Maison de Ma se puede ver y editar, en este caso.

Figura 9. Toda la informacin de los proveedores se pueden ver y editar.

Figura 10. Slo la informacin del proveedor seleccionado se puede ver y editar. Nota: Para este tutorial, tanto en el DropDownList y DetailsView control EnableViewState debe establecerse en verdadero (por defecto), debido a que el DropDownList 's SelectedIndex y elDetailsView 's DataSourceID cambios de propiedad debe ser recordado a travs de post-backs.

Paso 4: Listado de los productos de los proveedores en un GridView editable


Con el DetailsView completa, el siguiente paso es incluir una editable GridView que muestra los productos proporcionados por el proveedor seleccionado. Este GridView debe permitir ediciones a slo el ProductName yCantidadPorUnidad campos. Por otra parte, si el usuario visita la pgina de un proveedor en particular, slo se debe permitir que las actualizaciones de los productos que estn no interrumpido. Para lograr esto, primero tendr que agregar una sobrecarga de la ProductsBLL clase UpdateProducts mtodo que toma en tan slo el ProductID ,ProductName y CantidadPorUnidad campos como entradas. Hemos intensificado a travs de este proceso de antemano en numerosos tutoriales, as que vamos a mirar el cdigo aqu, que hay que aadir a ProductsBLL :
[System.ComponentModel.DataObjectMethodAttribute ( System.ComponentModel.DataObjectMethodType.Update, false)] pblica UpdateProduct bool (cadena productName, CantidadPorUnidad cadena, int productID) { Northwind.ProductsDataTable productos = Adapter.GetProductByProductID (ProductID); if (products.Count == 0)

/ / Ningn registro coincidente, devuelva falso return false; Northwind.ProductsRow producto = productos [0]; product.ProductName = productName; if (CantidadPorUnidad == null) product.SetQuantityPerUnitNull (); ms product.QuantityPerUnit = CantidadPorUnidad; / / Actualizar el registro del producto int = rowsAffected Adapter.Update (producto); / / Devuelve verdadero si, precisamente, una fila se ha actualizado, si no falsa volver rowsAffected == 1; }

Con esta sobrecarga creado, estamos listos para agregar el GridView de control y sus asociados ObjectDataSource .Aadir un nuevo GridView a la pgina, configurar su ID de propiedad de ProductsBySupplier , y configurarlo para usar un nuevo ObjectDataSource llamado ProductsBySupplierDataSource . Porque queremos que este GridView a la lista de los productos por parte del proveedor seleccionado, utilice el ProductsBLL clase GetProductsBySupplierID (supplierID) mtodo. Adems, el mapa de la actualizacin () mtodo para la nueva UpdateProduct sobrecarga que acabamos de crear.

Figura 11. Configurar el ObjectDataSource para utilizar la sobrecarga UpdateProduct acaba de crear. Nos pedir que seleccione la fuente de parmetros para el GetProductsBySupplierID (supplierID) mtodo supplierIDparmetro de entrada. Porque queremos mostrar los productos para el proveedor seleccionado en el DetailsView , utilice

el SuppliersDetails DetailsView control SelectedValue propiedad como la fuente de los parmetros.

Figura 12. Utilice la propiedad SuppliersDetails DetailsView de SelectedValue como la fuente de los parmetros. Volviendo a la GridView , eliminar todos los GridView campos excepto ProductName , CantidadPorUnidad ydescatalogados , marcando el interrumpidas CheckBoxField como de slo lectura. Adems, revise la Habilitar edicinopcin del GridView tag 's inteligente. Despus de estos cambios se han hecho, el marcado declarativo del GridView yObjectDataSource debe ser similar a lo siguiente:
<Asp: GridView ID = "ProductsBySupplier" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ProductsBySupplierDataSource"> <columnas> <asp:CommandField ShowEditButton="True" /> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CantidadPorUnidad" HeaderText = "Cantidad / Unidad" SortExpression = "CantidadPorUnidad" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" ReadOnly = "True" SortExpression = "interrumpidas" /> </ Columns> </ Asp: GridView> <Asp: ObjectDataSource ID = "ProductsBySupplierDataSource" runat = "server" OldValuesParameterFormatString = "original_ {0}" TypeName = "ProductsBLL" SelectMethod = "GetProductsBySupplierID" UpdateMethod = "UpdateProduct"> <UpdateParameters> <asp:Parameter Name="productName" tipo="String" /> <asp:Parameter Name="quantityPerUnit" tipo="String" /> <asp:Parameter Name="productID" Type="Int32" /> </ UpdateParameters>

<SelectParameters> <Asp: ControlParameter ControlID = "SupplierDetails" Name = "supplierID" PropertyName = "SelectedValue" Type = "Int32" /> </ SelectParameters> </ Asp: ObjectDataSource>

Al igual que con nuestro anterior ObjectDataSource s, este es OldValuesParameterFormatString propiedad se establece en original_ {0} , lo que causar problemas al intentar actualizar el nombre del producto o la cantidad por unidad. Quitar esta propiedad de la sintaxis declarativa del todo o se establece en su defecto, que es {0} . Con esta configuracin completa, ahora a nuestra pgina de las listas de los productos suministrados por el proveedor seleccionado en el GridView (ver figura 13). En la actualidad, cualquier nombre de producto o la cantidad por unidad se puede actualizar. Sin embargo, debemos actualizar nuestra lgica de la pgina, de modo que la funcionalidad est prohibida para productos descatalogados para los usuarios asociados a un determinado proveedor. Vamos a hacer frente a esta ltima pieza en el paso 5.

Figura 13. Los productos ofrecidos por el proveedor seleccionado. Nota: Con la adicin de este editable GridView los proveedores DropDownList 'sSelectedIndexChanged controlad or de eventos debe ser actualizado para devolver el GridView a un estado de slo lectura. De lo contrario, si un proveedor diferente es seleccionado, mientras que en el medio de la edicin de informacin de productos, el ndice correspondiente en el GridView para el nuevo proveedor tambin ser editable. Para evitar esto, acaba de

establecer el GridView 's EditIndexpropiedad a -1 en el SelectedIndexChanged controlador de eventos. Asimismo, recuerde que es importante que el GridView 's el estado de vista est activado (por defecto). Si se establece el GridView 's EnableViewState propiedad a falso , se corre el riesgo de tener usuarios concurrentes sin querer borrar o editar registros. (Ver ADVERTENCIA: punto de concurrencia con ASP.NET 2.0 GridViews / DetailsView / FormViews que la edicin de apoyo y / o eliminar y cuya visin del Estado est deshabilitado para ms informacin.)

Paso 5: Edicin No permitir para productos descatalogados en "Ver / Editar todos los proveedores" no est seleccionado
Mientras que el ProductsBySupplier GridView es completamente funcional, que actualmente permite el acceso demasiado a los usuarios que provienen de un proveedor en particular. Segn las reglas de nuestro negocio, los usuarios no debera ser capaz de actualizar los productos descontinuados. Para cumplir esto, podemos ocultar (o desactivar) la Edicin de botn en los GridView filas con productos descontinuados cuando la pgina est siendo visitada por un usuario de un proveedor. Crear un controlador de eventos para el GridView 's RowDataBound evento. En este controlador de eventos, debemos determinar si el usuario est asociado con un determinado proveedor, que, para este tutorial, se puede determinar mediante la comprobacin de los Proveedores DropDownList 's SelectedValue propiedad. Si se trata de algo distinto de -1, el usuario se asocia con un proveedor en particular. Para estos usuarios, se debe determinar si el producto est descatalogado. Podemos tomar una referencia a la actual ProductRow instancia enlazada a la GridView fila a travs de la e.Row.DataItem propiedad, como se indica en el Resumen de la Informacin en el pie de pgina Viendo el GridViewtutorial. Si el producto est descatalogado, podemos coger una referencia programtica a la edicin en el botnGridView 's CommandField utilizando las tcnicas explicadas en el tutorial anterior, Adicin del lado del cliente confirmacin cuando se eliminan . Tan pronto como tenemos una referencia, podemos ocultar o deshabilitar el botn.
protected void ProductsBySupplier_RowDataBound (object sender, GridViewRowEventArgs e) { si (== e.Row.RowType DataControlRowType.DataRow) { / / Se trata de un proveedor especfico de usuario? if (Suppliers.SelectedValue! = "-1") { / / Obtener una referencia a la ProductRow Northwind.ProductsRow producto = (Northwind.ProductsRow) ((System.Data.DataRowView) e.Row.DataItem) Fila.; / / Es esto producto descontinuado? if (product.Discontinued) { / / Obtener una referencia a la LinkButton Editar LinkButton editbutton = (LinkButton) e.Row.Cells [0] Controles [0].;

} } } }

/ / Ocultar el botn Editar editButton.Visible = false;

Con este controlador de eventos en el lugar, al visitar esta pgina como un usuario de un proveedor especfico, aquellos productos que son discontinuas no son modificables, como la edicin botn se oculta de estos productos. Por ejemplo, Mezcla Gumbo del chef Anton es un producto descontinuado por el Cajun de Nueva Orleans Delicias proveedor. Al visitar la pgina de este proveedor en particular, la Edicin de botn de este producto est oculto a la vista (ver figura 14). Sin embargo, cuando se visita usando la opcin "Mostrar / Editar todos los proveedores" de laEdicin botn est disponible (ver Figura 15).

Figura 14. De proveedores y usuarios especficos, en el botn Editar para Mezcle Gumbo del chef Anton se oculta.

Figura 15. Para "Mostrar / Editar todos los proveedores" los usuarios, el botn Editar para Mezcle Gumbo del chef Anton se muestra.

Comprobacin de los derechos de acceso en la capa de lgica de negocios


En este tutorial, la pgina de ASP.NET controla toda la lgica con respecto a la informacin que el usuario puede ver y qu productos se pueden actualizar. Idealmente, esta lgica tambin estara presente en la capa de lgica de negocios.Por ejemplo, el SuppliersBLL clase GetSuppliers () mtodo (que devuelve todos los proveedores) podran incluir una verificacin para asegurarse de que haya iniciado la sesin en el usuario es no asociados a un determinado proveedor.Asimismo, el UpdateSupplierAddress mtodo podra incluir un control para asegurarse de que haya iniciado la sesin en el usuario o bien trabajaban para la empresa (y por lo tanto, puede actualizar la informacin de todos los proveedores de direcciones) o se asocia con el proveedor cuyos datos se est actualizando. No inclu como BLL-capa comprueba aqu, porque en nuestro tutorial de los derechos de los usuarios son determinados por un DropDownList en la pgina, que las clases BLL no pueden acceder. Cuando se utiliza el sistema de suscripciones o uno de los fuera de los esquemas de autenticacin caja proporcionada por ASP.NET (por ejemplo, la autenticacin de Microsoft Windows), ha iniciado la sesin en la informacin del usuario y las funciones de informacin se puede acceder desde la toma de BLL-as como acceso a los derechos posibles controles, tanto en la presentacin y las capas de plomo en sangre.

Conclusin
La mayora de los sitios que ofrecen cuentas de usuario debe personalizar la interfaz de modificacin de datos basado en el usuario ha iniciado sesin. Los usuarios administrativos pueden ser capaces de eliminar y editar cualquier documento, mientras que los usuarios no administrativos pueden estar limitados a slo actualizar o eliminar registros que ellos mismos crearon. Sea cual sea el escenario que sea, los controles web de datos, ObjectDataSource , y las clases de negocios Capa de lgica se puede extender para agregar o negar determinadas funciones sobre la base de que el usuario ha iniciado sesin. En este tutorial, hemos visto cmo limitar los datos visibles y editables en funcin de si el usuario se asoci con un determinado proveedor o si trabajaban para la compaa. En este tutorial se concluye el examen de insertar, actualizar y eliminar datos mediante el GridView , DetailsView yFormView controles. Comenzando con el siguiente tutorial, vamos a dirigir nuestra atencin a la adicin de paginacin y la clasificacin de apoyo.

Paginacin y clasificacin

Tutorial 24: Paging y ordenar datos de informe


Scott Mitchell 04 2007 Resumen: Este es el Visual C # tutorial. ( Cambie al tutorial de Visual Basic .) paginacin y la clasificacin son dos caractersticas muy comunes al mostrar datos en una aplicacin en lnea. En este tutorial, vamos a echar un primer vistazo a la adicin de la clasificacin y localizacin de nuestros informes, que luego se basar en futuros tutoriales. (21 pginas impresas) Descargar el cdigo de la muestra . Contenido del Tutorial 24 (Visual C #) Introduccin Paso 1: Agregar la paginacin y la clasificacin Web Tutorial Pginas Paso 2: Visualizacin de informacin del producto en un GridView Paso 3: Adicin de compatibilidad de paginacin El usuario de paginacin experiencia de paginacin del lado del servidor de flujo de trabajo Paso 4: Personalizar la experiencia de paginacin

Paso 5: Agregar Apoyo Clasificacin bidireccional examinar el flujo de trabajo Clasificacin Clasificacin del GridView mediante programacin Conclusin

Introduccin
Paginacin y la clasificacin son dos caractersticas muy comunes al mostrar datos en una aplicacin en lnea. Por ejemplo, en la bsqueda de libros de ASP.NET en una librera en lnea, puede haber cientos de libros, pero el informe que enumera los resultados de bsqueda slo enumera 10 resultados por pgina. Por otra parte, los resultados pueden ser ordenados por ttulo, precio, nmero de pginas, el nombre del autor, y as sucesivamente. Mientras que en los ltimos 23 tutoriales han examinado cmo construir una variedad de informes, incluyendo las interfaces que permiten agregar, editar y eliminar datos no-hemos visto cmo ordenar los datos, y los ejemplos de paginacin nico que hemos visto han sido con el DetailsView y FormView controles. En este tutorial, vamos a ver cmo agregar ordenacin y paginacin de nuestros informes, que se puede lograr simplemente marcando una casilla de verificacin pocos. Por desgracia, esta implementacin simplista tiene sus inconvenientes: La interfaz de la clasificacin deja un poco que desear, y las rutinas de bsqueda no estn diseados para una eficiente localizacin a travs de conjuntos de resultados grandes. Tutoriales futuro se estudiar la forma de superar las limitaciones de la paginacin fuera de la caja y las soluciones de ordenacin.

Paso 1: Agregar la paginacin y la clasificacin Pginas Web Tutorial


Antes de empezar este tutorial, primero tome un momento para agregar las pginas ASP.NET que necesitaremos para este tutorial y los tres siguientes. Comience por crear una nueva carpeta llamada PagingAndSorting en el proyecto. A continuacin, agregue los siguientes cinco pginas ASP.NET en esta carpeta, teniendo todos ellos configurados para utilizar el Site.master pgina maestra:

Default.aspx SimplePagingSorting.aspx EfficientPaging.aspx SortParameter.aspx CustomSortingUI.aspx

Figura 1. Cree una carpeta PagingAndSorting y aadir las pginas ASP.NET tutorial. A continuacin, abra la pgina Default.aspx y arrastre el control de usuario SectionLevelTutorialListing.ascx de la carpeta UserControls en la superficie de diseo. Este control de usuario que hemos creado en la pginas principales y de exploracin del sitio tutorial, enumera el mapa del sitio y muestra los tutoriales de la seccin actual en una lista con vietas.

Figura 2. Agregar el control de usuario SectionLevelTutorialListing.ascx a Default.aspx. Con el fin de tener la lista con vietas mostrar la paginacin y la clasificacin tutoriales que estamos creando, hay que aadir al mapa del sitio. Abra el archivo Web.sitemap y agregue el marcado siguiente despus de la "Edicin, insertar y eliminar" del mapa del sitio nodo marcado:
<SiteMapNode title = "paginacin y la clasificacin", url = "~ / PagingAndSorting / Default.aspx" description = "Ejemplos de informes que proporcionan paginacin y la clasificacin Capacidades "> <SiteMapNode url = "~ / PagingAndSorting / SimplePagingSorting.aspx" title = "Ejemplos simples de paginacin y ordenacin" description = "Examina cmo agregar paginacin simple y clasificacin apoyo. "/> <SiteMapNode url = "~ / PagingAndSorting / EfficientPaging.aspx" title = "de manera eficiente Paginar a travs de grandes conjuntos de resultados" description = "Aprender de manera eficiente a travs de la pgina de resultados grande establece. "/> <SiteMapNode url = "~ / PagingAndSorting / SortParameter.aspx" title = "ordenar datos en el BLL o DAL" description = "Muestra cmo realizar la lgica de la clasificacin en el Lgica de Negocio Capa o de acceso a datos. "/> <SiteMapNode url = "~ / PagingAndSorting / CustomSortingUI.aspx" title = "Personalizacin de la interfaz de usuario de ordenacin" description = "Aprenda a personalizar y mejorar la ordenacin de usuario interfaz. "/> </ SiteMapNode>

Figura 3. Actualizar el mapa del sitio para incluir las nuevas pginas ASP.NET

Paso 2: Visualizacin de informacin del producto en un GridView


Antes de que realmente poner en prctica las capacidades de paginacin y la clasificacin, primero vamos a crear un estndar no se puede escribir, no paginable GridView que muestra la informacin del producto. Esta es una tarea que hemos hecho muchas veces antes en toda esta serie de tutoriales, as, estas medidas deben estar familiarizados.Comience abriendo la pgina SimplePagingSorting.aspx y arrastre un control GridView de control de la caja de herramientas en el diseo, configuracin de su ID de propiedad de los productos . A continuacin, cree un nuevoObjectDataSource que utiliza el ProductsBLL clase GetProducts () para devolver toda la informacin del producto.

Figura 4. Recuperar informacin acerca de todos los productos mediante el uso de la GetProducts () mtodo. Debido a que este informe es un informe de slo lectura, no hay necesidad de trazar el ObjectDataSource 's Insert () ,Update () o Eliminar () mtodos a los correspondientes ProductsBLL mtodos, por lo tanto, elija (Ninguno) en la lista desplegable para la ACTUALIZACIN , INSERTAR y BORRAR las fichas.

Figura 5. Elija la opcin (Ninguno) en la lista desplegable en el UPDATE, INSERT y DELETE pestaas. A continuacin, vamos a personalizar el GridView los campos s, de modo que slo los productos de los nombres, proveedores, categoras, precios, y los estados de suspender se muestran. Por otra parte, no dude en hacer cualquier cambio de formato a nivel de campo, como el ajuste del HeaderText propiedades o el formato del precio de una moneda. Despus de estos cambios, el GridView marcado declarativo 's debe ser similar a lo siguiente:
<Asp: GridView ID = "Productos" runat = "server" AutoGenerateColumns = "False" DataKeyNames = "ProductID" DataSourceID = "ObjectDataSource1" EnableViewState = "false"> <columnas> <Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" /> <Asp: BoundField DataField = "CategoryName" HeaderText = "Categora" ReadOnly = "True" SortExpression = "CategoryName" /> <Asp: BoundField DataField = "SupplierName" HeaderText = "Proveedor" ReadOnly = "True" SortExpression = "SupplierName" /> <Asp: BoundField DataField = "UnitPrice" HeaderText = "Precio" SortExpression = "UnitPrice" DataFormatString = "{0: C}" HtmlEncode = "false" /> <Asp: CheckBoxField DataField = "interrumpidas" HeaderText = "interrumpidas" SortExpression = "interrumpidas" /> </ Columns> </ Asp: GridView>

La figura 6 muestra nuestro progreso hasta ahora cuando se ve a travs de un navegador. Tenga en cuenta que la pgina se enumeran todos los productos en una sola pantalla, mostrando el nombre de cada producto, categora, proveedor, precio, y el estado suspendido.

Figura 6. Cada uno de los productos est en la lista.

Paso 3: Aadir soporte de paginacin


Listado de todos los productos en una sola pantalla puede conducir a una sobrecarga de informacin para el usuario leer los datos. Para ayudar a que los resultados sean ms manejables, podemos dividir los datos en pginas ms pequeas de datos y permiten al usuario paso a travs de los datos de una pgina a la vez. Para lograr esto basta con marcar la paginacin Activar casilla de verificacin de la GridView 's etiqueta inteligente (esto establece el GridView 'spropiedad AllowPaging de verdad ).

Figura 7. Marque la casilla de verificacin Habilitar paginacin para aadir soporte de paginacin. Activacin de paginacin limita el nmero de registros mostrados por pgina y aade una interfaz de paginacin alGridView . La interfaz de paginacin por defecto, que se muestra en la figura 7, es una serie de nmeros de pgina, que permite al usuario navegar rpidamente de una pgina de datos a otro. Esta interfaz de paginacin debe resultarle familiar, como lo hemos visto cuando se aade el apoyo de paginacin para el DetailsView y FormView controles en tutoriales anteriores. Tanto el DetailsView y FormView slo muestra los controles de un solo registro por pgina. El GridView , sin embargo, consulte a su propiedad PageSize para determinar el nmero de registros a mostrar por pgina (por defecto esta propiedad a un valor de 10). Este GridView , DetailsView y FormView interfaz 's de paginacin se puede personalizar mediante el uso de las siguientes propiedades:

PagerStyle : indica la informacin de estilo para la interfaz de paginacin, puede especificar la configuracin como BackColor , ForeColor , CssClass , HorizontalAlign , y as sucesivamente.

PagerSettings -Contiene un grupo de propiedades que puede personalizar la funcionalidad de la interfaz de bsqueda; PageButtonCount indica el nmero mximo de nmeros de pgina numricos muestran en la interfaz de paginacin (por defecto es 10), la propiedad Mode indica cmo la interfaz de paginacin funciona y se puede establece en: SiguienteAnterior. Muestra una Siguiente y Anterior botones, permitiendo al usuario paso hacia delante o hacia atrs una pgina a la vez. NextPreviousFirstLast. Adems de Siguiente y Anterior botones, Primero y ltimo botones tambin estn incluidos, lo que permite al usuario moverse rpidamente a la primera o ltima pgina de datos. Numricos. Muestra una serie de nmeros de pgina, que permite al usuario saltar a cualquier pgina de inmediato. NumericFirstLast. Adems de los nmeros de pgina, incluye primer y ltimo botn, que permite al usuario pasar rpidamente a la primera o ltima pgina de datos, el Primer / ltimo botones se muestran slo si todos los nmeros de pgina numrico no puede encajar.

Por otra parte, el GridView , DetailsView y FormView ofrecen la PageIndex y PageCount propiedades, lo que indica la pgina actual que se est viendo y el nmero total de pginas de datos, respectivamente. El PageIndex propiedad est indexada a partir de las 0-lo que significa que, al ver la primera pgina de los datos, PageIndex ser igual a 0.PageCount , por otro lado, empieza a contar a 1, lo que significa que PageIndex se limita a los valores entre 0 yPageCount - 1 . Tomemos un momento para mejorar la apariencia por defecto de nuestro GridView interfaz de paginacin 's. En concreto, vamos a tener la interfaz de paginacin alineado a la derecha con un fondo gris claro. En lugar de establecer directamente estas propiedades a travs del GridView 's PagerStyle propiedad, vamos a crear una clase CSS en styles.css llamado PagerRowStyle , a continuacin, asignar el PagerStyle 's CssClass propiedad a travs de nuestro tema. Comience abriendo styles.css y aadir la siguiente definicin de clase CSS:
. PagerRowStyle { background-color: # ddd; text-align: right; }

A continuacin, abra el archivo en la carpeta GridView.skin DataWebControls dentro de la carpeta App_Themes. Como ya comentamos en la pginas principales y de exploracin del sitio tutorial, los archivos de la piel se puede utilizar para especificar el valor de la propiedad predeterminada de un control Web. Por lo tanto, aumentar las opciones existentes para incluir el establecimiento de la PagerStyle 's CssClass propiedad PagerRowStyle . Adems, vamos a configurar la interfaz de paginacin para mostrar un mximo de cinco botones de pgina numricos utilizando el NumericFirstLastinterfaz de paginacin.
<asp:GridView runat="server" CssClass="DataWebControlStyle"> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <RowStyle CssClass="RowStyle" /> <HeaderStyle CssClass="HeaderStyle" /> <FooterStyle CssClass="FooterStyle" />

<SelectedRowStyle CssClass="SelectedRowStyle" /> <PagerStyle CssClass="PagerRowStyle" /> <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" /> </ Asp: GridView>

La experiencia de usuario de paginacin


La figura 8 muestra la pgina Web cuando se acceda a travs de un navegador despus de que el GridView 's de paginacin Activar casilla de verificacin ha sido comprobado y el PagerStyle y PagerSettings configuraciones se han hecho a travs de la GridView.skin archivo. Tenga en cuenta cmo slo 10 se muestran los registros, y la interfaz de paginacin puede indicar que estamos viendo la primera pgina de los datos.

Figura 8. Cuando active la paginacin, slo un subconjunto de los registros se muestra a la vez. Cuando el usuario hace clic en uno de los nmeros de pgina en la interfaz de bsqueda, una devolucin de datos sigue y vuelve a cargar la pgina, que muestra los registros que la pgina solicitada. La Figura 9 muestra los resultados despus de optar para ver la ltima pgina de datos. Tenga en cuenta que la ltima pgina tiene slo un registro, esto es as, porque hay 81 registros en total, que se traduce en ocho pginas de 10 registros por pgina, ms una pgina con un registro nico.

Figura 9. Al hacer clic en un nmero de pgina hace una devolucin de datos y muestra el subconjunto apropiado de registros.

Paginacin del lado del servidor de flujo de trabajo


Cuando el usuario final hace clic en un botn en la interfaz de bsqueda, una devolucin de datos sigue y comienza el siguiente servidor de flujo de trabajo:
1. El GridView 's (o DetailsView o FormView ) PageIndexChanging activa el

evento.
2. El ObjectDataSource re-solicitudes de todos los datos de la BLL,

el GridView 's PageIndex y PageSize valores de las propiedades se utilizan para determinar qu registros devueltos desde la BLL se debe mostrar en el GridView. 3. El GridView 's PageIndexChanged activa el evento. En el paso 2, el ObjectDataSource re-solicitudes de todos los datos de la fuente de datos. Este estilo de localizacin se conoce comnmente como la paginacin por defecto , ya que es el comportamiento de paginacin utiliza por defecto la hora de establecer el AllowPaging propiedad real . Con la paginacin por defecto en el control Web de datos ingenuamente recupera todos los registros de cada pgina de datos, a pesar de que slo un subconjunto de los registros son efectivamente prestados en el cdigo HTML que se enva al navegador. A menos que los datos de base de datos se almacena en cach por el BLL o ObjectDataSource , la paginacin por defecto es inviable para los conjuntos de resultados lo suficientemente grandes o para aplicaciones Web con muchos usuarios simultneos. En el siguiente tutorial, vamos a examinar cmo implementar la paginacin personalizada . Con la paginacin personalizada que especficamente puede instruir al ObjectDataSource para recuperar slo el conjunto preciso de los registros necesarios para la pgina de datos solicitada. Como se puede imaginar, la paginacin personalizada mejora la eficiencia de la localizacin a travs de conjuntos de resultados grandes. Nota: Mientras que la paginacin por defecto no es adecuado cuando la paginacin a travs de conjuntos de resultados lo suficientemente grande o de los sitios con muchos usuarios simultneos, se dan cuenta que la paginacin personalizada requiere ms cambios y esfuerzos para aplicar y no es tan sencillo como marcar una casilla de verificacin (como es la paginacin por defecto) . Por lo tanto, la paginacin por defecto

puede ser la opcin ideal para los pequeos sitios, web de bajo trfico o cuando la paginacin a travs de conjuntos de resultados relativamente pequeo, ya que es mucho ms fcil y rpido de implementar. Por ejemplo, si sabemos que nunca vamos a tener ms de 100 productos en nuestra base de datos, la ganancia de rendimiento mnimo que gozan de paginacin personalizada es probable que compensado por el esfuerzo necesario para ponerlo en prctica. Si, sin embargo, que un da podra tener miles o decenas de miles de productos, no la aplicacin de paginacin personalizada en gran medida dificultan la escalabilidad de nuestra aplicacin.

Paso 4: Personalizar la experiencia de paginacin


Los controles de datos de Web ofrecen una serie de propiedades que se pueden utilizar para mejorar la experiencia del usuario de paginacin. El PageCount propiedad, por ejemplo, indica el nmero de pginas total hay, mientras que elPageIndex propiedad indica la pgina actual que se visita y se puede configurar para mover un usuario a una pgina especfica rpidamente. Para ilustrar cmo utilizar estas propiedades para mejorar la experiencia de paginacin del usuario, vamos a aadir una etiqueta de control de Internet a la pgina que informa al usuario de la pgina en que te encuentras en, junto con un DropDownList de control que les permite saltar rpidamente a cualquier dado pgina. En primer lugar, aadir una etiqueta de control de Internet a la pgina, configurar su ID de propiedad dePagingInformation , y claro a su texto la propiedad. A continuacin, cree un controlador de eventos para el GridView's DataBound evento y agregue el siguiente cdigo:
protected void Products_DataBound (object sender, EventArgs e) { PagingInformation.Text = String.Format ("Usted est viendo la pgina {0} de {1 }...", Products.PageIndex + 1, Products.PageCount); }

Este controlador de eventos asigna el PagingInformation etiqueta 's de texto propiedad a un mensaje que informa al usuario de la pgina que estn visitando actualmente- Products.PageIndex + 1 , de la forma total de muchas pginasProducts.PageCount (se aade 1 a la Products.PageIndex propiedad , porque PageIndex est indexada a partir de 0).Eleg el asignar esta etiqueta 's de texto de propiedad en el DataBound controlador de eventos, a diferencia de laPageIndexChanged controlador de eventos, ya que el DataBound evento se activa cada vez que los datos se une a laGridView , mientras que el PageIndexChanged controlador de eventos slo se activa cuando el ndice de la pgina es cambiado. Cuando el GridView es inicialmente los datos consolidados sobre la visita de la primera pgina, elPageIndexChanging evento no se dispara (mientras que el DataBound caso lo hace). Con esta adicin, el usuario ahora se muestra un mensaje indicando que la pgina que estn visitando y el nmero de pginas total hay de los datos.

Figura 10. El nmero de pgina actual y el nmero total de pginas se muestran. Adems de la etiqueta de control, tambin vamos a agregar un DropDownList de control que muestran los nmeros de pgina en el GridView con la pgina actual en Firefox seleccionado. La idea aqu es que el usuario puede saltar rpidamente de la pgina actual a otra con slo seleccionar el ndice de la nueva pgina de la DropDownList .Comience por agregar un DropDownList al diseador, el establecimiento de su ID de propiedad de PageList y el control de la AutoPostBack Habilitar la opcin de su etiqueta inteligente. A continuacin, volver a la DataBound controlador de eventos y aadir el siguiente cdigo:
/ / Acaba con todos los elementos de la DropDownList PageList.Items.Clear (); / / Aadir un ListItem por cada pgina for (int i = 0; i <Products.PageCount; i + +) { / / Se aade el nuevo ListItem ListItem pageListItem = new ListItem (String.Concat ("Pgina", i + 1), i.ToString ()); PageList.Items.Add (pageListItem); / / Selecciona el elemento actual, si es necesario if (i == Products.PageIndex) pageListItem.Selected = true;

Este cdigo empieza por la limpieza de los elementos de la PageList DropDownList . Esto podra parecer superflua, ya que uno no esperara que el nmero de pginas para cambiar, pero otros usuarios pueden utilizar el sistema simultneamente, aadir o eliminar registros de la los productos de mesa. Tales inserciones o deleciones podran alterar el nmero de pginas de datos.

A continuacin, debe crear los nmeros de pgina de nuevo y tener la que se asigna a la actual GridView PageIndexseleccionada por defecto. Esto lo logramos con un bucle de 0 a PageCount - 1 -aadiendo un nuevo ListItem en cada iteracin y se fijan las seleccionadas a la propiedad real , si el ndice de iteracin actual es igual a la GridView 'sPageIndex propiedad. Por ltimo, se debe crear un controlador de eventos para el DropDownList 's SelectedIndexChanged evento, que se activa cada vez que el usuario elija un elemento diferente de la lista. Para crear este controlador de eventos, haga doble clic en el DropDownList en el diseo, a continuacin, agregue el siguiente cdigo:
protected void PageList_SelectedIndexChanged (object sender, EventArgs e) { / / Ir a la pgina especificada Products.PageIndex = Convert.ToInt32 (PageList.SelectedValue); }

Como muestra la Figura 11 se muestra, simplemente cambiando el GridView 's PageIndex propiedad hace que los datos se vuelvan a enlazar con el GridView . En el GridView 's DataBound controlador de eventos, las correspondientes DropDownList ListItem est seleccionado.

Figura 11. El usuario es llevado automticamente a la pgina sexta, cuando la seleccin de la "Pgina 6" desplegable elemento de la lista.

Paso 5: Agregar compatibilidad bidireccional clasificacin


Aadiendo soporte bidireccional clasificacin es tan simple como aadir soporte de paginacin, simplemente marque laHabilitar ordenacin opcin del GridView 's etiqueta inteligente (que establece el GridView 's propiedad AllowSortingde verdad ). Esto hace que cada una de las cabeceras de los GridView campos 's como LinkButton s que, al

hacer clic, hacer una devolucin de datos y devolver los datos ordenados por la columna hace clic en orden ascendente. Al hacer clic en la misma cabecera LinkButton nuevo reordena los datos en orden descendente. Nota: Si est utilizando una capa de datos personalizada de acceso en lugar de un DataSet con tipo, puede que no tenga una Habilitar ordenacin opcin en el GridView tag 's inteligente. Slo GridView s ligado a las fuentes de datos que soporta de forma nativa la clasificacin tiene esta casilla de verificacin disponibles. El DataSet ofrece fuera de la caja admite la ordenacin, ya que la DataTable ADO.NET proporciona una Clasificar mtodo que, cuando se invoca, tipo DataRow del DataTable, utilizando los criterios especificados. Si el DAL no devuelve los objetos que soporta de forma nativa la clasificacin, tendr que configurar elObjectDataSource para pasar la informacin de clasificacin a la capa de lgica empresarial, que puede ordenar los datos o los datos ordenados por el DAL. Vamos a estudiar la forma de ordenar los datos en la lgica de negocios y las capas de acceso a datos en un tutorial futuro. La clasificacin LinkButton s se representan como hipervnculos HTML, cuyo actual colores (azul para un enlace no visitado y una de color rojo oscuro de un vnculo visitado) chocan con el color de fondo de la fila de encabezado. En su lugar, vamos a tener todos los enlaces fila de encabezado aparece en blanco, sin importar si son o no han sido visitados. Esto se puede lograr mediante la adicin de lo siguiente a la styles.css clase:
. HeaderStyle uno, HeaderStyle a:. Visit { Color: Blanco; }

Esta sintaxis indica que el uso de texto blanco cuando se muestran los hipervnculos dentro de un elemento que utiliza elHeaderStyle clase. Despus de esta adicin CSS, cuando se visita la pgina a travs de un navegador, la pantalla debe ser similar a la Figura 12. En particular, la figura 12 muestra los resultados despus de que el precio vnculo de campo de cabecera se ha hecho clic.

Figura 12. Los resultados han sido ordenados por el PrecioUnidad en orden ascendente.

Examinar el flujo de trabajo de clasificacin


Todos GridView campos-el BoundField , CheckBoxField , TemplateField , y as sucesivamente-tienen unSortExpression propiedad que indica la expresin que se debe utilizar para ordenar los datos en ese campo de enlace de la clasificacin de cabecera se hace clic. El GridView tambin tiene un SortExpression propiedad. Cuando un encabezado la clasificacin LinkButton se hace clic en el GridView asigna ese campo SortExpression valor a susSortExpression propiedad. A continuacin, los datos se vuelve a recuperar de la ObjectDataSource y se ordenan de acuerdo con el GridView 's SortExpression propiedad. La siguiente lista detalla la secuencia de pasos que suceden cuando un tipo de usuario final de los datos en un GridView :
1. El GridView 's Clasificacin evento incendios. 2. El GridView 's propiedad SortExpression se establece en el SortExpression del

campo cuya clasificacin cabecera LinkButton se ha hecho clic. 3. El ObjectDataSource re-recupera todos los datos de la BLL a continuacin, ordena los datos mediante elGridView 's SortExpression . 4. El GridView 's PageIndex propiedad se restablece a 0, lo que significa que al ordenar el usuario vuelve a la primera pgina de datos (suponiendo que el apoyo de paginacin se ha implementado) 5. El GridView 's evento Sorted incendios. Al igual que con la paginacin por defecto, la opcin por defecto de clasificacin rerecupera todos los registros de la BLL. Cuando se utiliza la clasificacin, sin paginacin o cuando se utiliza la clasificacin con la paginacin por defecto, no hay manera de evitar este impacto en el rendimiento (por debajo de almacenamiento en cach los datos de base

de datos). Sin embargo, como veremos en un tutorial futuro, es posible ordenar de manera eficiente los datos cuando se utiliza la paginacin personalizada. Al enlazar un ObjectDataSource a la GridView a travs de la lista desplegable en el GridView tag 's inteligente, cadaGridView campo automticamente tiene su SortExpression propiedad asignada al nombre del campo de datos en elProductsRow clase. Por ejemplo, el ProductName BoundField 's SortExpression est establecido en ProductName , como se muestra en el marcado declarativo siguiente:
<Asp: BoundField DataField = "ProductName" HeaderText = "Producto" SortExpression = "ProductName" />

Un campo puede ser configurado de manera que no es clasificable en la limpieza de sus SortExpression propiedad (asignndole una cadena vaca). Para ilustrar esto, imagine que no quera dejar a nuestros clientes ordenar nuestros productos por el precio. El PrecioUnidad BoundField 's SortExpression propiedad puede ser apartados del el marcado declarativo o por medio de la Campos cuadro de dilogo (que se puede acceder haciendo clic en el Editar columnas enlace en el GridView 's etiqueta inteligente).

Figura 13. Los resultados han sido ordenados por el PrecioUnidad en orden ascendente. Tan pronto como el SortExpression propiedad se ha eliminado la PrecioUnidad BoundField , el encabezado se representa en forma de texto, en lugar de como un enlace con ello evitar que los usuarios de la clasificacin de los datos de precios.

Figura 14. Mediante la eliminacin de la propiedad SortExpression, los usuarios ya no pueden ordenar los productos por el precio.

Clasificacin de los GridView mediante programacin


Tambin puede ordenar el contenido de la GridView mediante programacin con el GridView 's mtodo Sort . Slo tiene que pasar en el SortExpression valor por el que se ordenan, junto con el SortDirection ( ascendente odescendente ), y el GridView de datos 's va a ser re-ordenados. Imagina que la razn por la que apaga la clasificacin por la PrecioUnidad era que estbamos preocupados de que nuestros clientes slo podra comprar solamente los productos de menor precio. Sin embargo, queremos animarlos a comprar los productos ms caros, as que, nos gustara que fueran capaces de ordenar los productos por precio, pero slo desde el precio ms caro de lo ms mnimo. Para lograr esto, agregar un botn de control Web a la pgina, configurar su ID de propiedad deSortPriceDescending , y su texto a la propiedad "Ordenar por precio". A continuacin, cree un controlador de eventos para el botn de 's Haga clic en evento haciendo doble clic en el botn de control en el diseador. Agregue el siguiente cdigo a este controlador de eventos:
protected void SortPriceDescending_Click (object sender, EventArgs e) { / / Ordenar por PrecioUnidad en orden descendente Products.Sort ("Precio por unidad", SortDirection.Descending); }

Al hacer clic en este botn , el usuario regresa a la primera pgina con los productos ordenados por precio, de ms caro a ms barato (ver Figura 15).

Figura 15. Al hacer clic en el botn de las rdenes de los productos ms caros de lo caro.

Conclusin
En este tutorial, vimos cmo implementar la paginacin por defecto y clasificar las capacidades, tanto de los que era tan fcil como marcar una casilla! Cuando un tipo de usuario o las pginas a travs de los datos, un flujo de trabajo similar se desarrolla: 1. Una devolucin de datos se produce. 2. El control de datos Web de pre-grado se activa el evento ( PageIndexChanging o clasificacin ). 3. Todos los datos se vuelve a recuperar el ObjectDataSource . 4. El control de datos Web de nivel post-activa el evento ( PageIndexChanged o Ordenado ). Mientras que la aplicacin de la paginacin y la clasificacin bsica es muy sencilla, ms esfuerzo se debe ejercer para utilizar la paginacin personalizada ms eficiente o para mejorar la interfaz de paginacin o clasificacin. Tutoriales futuro a explorar estos temas.

You might also like