Source: http://www.slideshare.net/josegaitan/dce2-ejercicios-aspnet
Timestamp: 2016-06-29 09:07:48+00:00

Document:
Ejercicio basico en asp.net LOZADA ...
Ejercicio de creacion de formularios asp.net
________________________________________________ Programa Desarrollador Cinco Estrellas 2005 Estrella 2 ________________________________________________Guia de Ejericicios – Aplicaciones Web Formscon ASP.NET Página 1 de 52
ÍndiceRequisitos ............................................................................................................................ 3Introducción.......................................................................................................................... 4ASP .NET 2.0 – Paso a Paso............................................................................................... 5Grid View.............................................................................................................................. 5DetailsView ........................................................................................................................ 16FormView ........................................................................................................................... 24DataList .............................................................................................................................. 27Enlazando Datos con Objetos............................................................................................ 30 Enlazando con la capa de acceso a Datos..................................................................... 30 Enlazando a una Clase de Negocios.............................................................................. 39TREEVIEW + DataAdapter ................................................................................................ 49 Página 2 de 52
Requisitos • Haber cursado y aprobado el examen correspondiente al módulo de la Estrella 1 del programa Desarrollador 5 Estrellas. • Haber leído y comprendido el material teórico correspondiente al módulo de la Estrella 2 del programa. • Para la resolucion de los ejercicios debe tener instalado: o MS Visual Studio 2005 / Visual Web Developer 2005 Express Edition. o MS SQL Server 2005 Express Edition.Debe instalar además las siguientes bases de datos: - Northwind (http://www.microsoft.com/downloads/details.aspx?FamilyId=06616212- 0356-46A0-8DA2-EEBC53A68034&displaylang=en ) - AdventureWorks (http://www.microsoft.com/downloads/details.aspx?familyid=9697AAAA-AD4B-416E- 87A4-A8B154F92787&displaylang=en )Para instalar correctamente la base AdventureWorks se recomienda la lectura deldocumento titulado “SQL Server 2005 Databases and Samples Overview”, que acompañaa esta guia. También puede ser descargado dehttp://download.microsoft.com/download/d/8/6/d865cf0c-c44b-401b-b426-b3bf5c628112/SQLServerDatabasesAndSamplesOverview.htm Página 3 de 52
IntroducciónEn el presente documento se desarrollan distintos ejercicios “Paso a Paso” que sirven decomplemento al curso Estrella 2 – ASP.NET, del programa Desarrollador 5 Estrellas.Los ejercicios aquí desarrollados muestran paso a paso como realizar aplicaciones websimples con acceso a datos, y pueden realizarse en C# y/o VB.NET (hay porciones decódigo transcriptas, e imágenes que lo guiarán para lograr los objetivos).Se han resuelto algunos de los ejercicios para que el alumno pueda tener el ejemplo delcodigo terminado. Los ejercicios resueltos de esta guia paso a paso son: • GridView • DetailsView • Enlazando con la capa de negociosTodos ellos se encuentran en el proyecto “DCE2005 Acceso a Datos”, adjunto al materialdel curso.También se encuentran adjuntas al material otros dos proyectos, uno que ejemplifica lautilización de los nuevos controles de login incorporados en ASP.NET 2.0, y otro quemuestra la utilización de páginas maestras y los nuevos controles de navegación y menú.En el ejercicio de Acceso a Datos se incluyen también el nuevo concepto de Themes &Skins, para dar a la aplicación un aspecto agradable (este nuevo tema esta desarrolladoen la presentación teórica). Página 4 de 52
ASP .NET 2.0 – Paso a Paso Grid ViewObjetivo: Construir un formulario con un control GridView para visualizar,modificar y eliminar datos de la tabla “Products” de la base de datosNorthwind.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. Abra el Visual Web Developer 2005 Express Edition. Seleccione el menú File / New Web Site para crear un nuevo Web Site, según la siguiente figura. Note que el lenguaje es el Visual Basic, pero si usted desea cambiarlo a Visual C# no hay ningún problema, ya que los pasos son los mismos. 2. Luego presione el botón OK. Se abrirá una ventana conteniendo la página Default.aspx con el HTML que se mostrará. A los efectos del ejercicio, vamos a crear páginas relativas al tópico abordado, por lo tanto, abra el Solution Explorer (Ctrl + Alt + L) y excluya esta página. Para agregar una nueva página al Solution Explorer, haga click con el botón derecho sobre C:WebSiteDCE20005 y seleccione Add New Item. Escriba GridView.aspx en el nombre de la página y haga click en Add. Página 5 de 52
3. En caso de que quiera escribir los Tags HTML directamente en esta ventana, siéntase a gusto, sin embargo, le mostraré los controles en la ventana de Design. Siendo así, haga click en el botón Design en el pie de la página. Página 6 de 52
4. Abra la Toolbox y arrastre un control GridView hacia el formulario. Se abrirá una Smart Tag conteniendo diversas opciones. Página 7 de 52
5. Seleccione Auto Format y aplique un formato de acuerdo con su gusto.6. Para definir la fuente de datos, en Choose Data Source seleccione New Data Source.7. Usted puede seleccionar cualquier fuente de datos, pero en este caso elija Database. Note que ya se define un ID (SqlDataSource1), y en caso de que quiera alterarlo bastará con escribirlo. Como vamos a utilizar esta conexión en varios ejercicios, deje el checkbox de conexión seleccionado para que la string de conexión sea almacenada en el archivo Web.Config. Página 8 de 52
8. Se abrirá un “wizard” por el cual se configura la base de datos y se arma la cadena de conexión, le dejamos ese paso para que lo configure de acuerdo a sus necesidades.9. Una vez configurada la cadena de conexión necesita identificar cuál es la tabla que será usada como fuente de datos. Seleccione Productos y algunos campos. Página 9 de 52
10. Como permitiremos la edición de datos en el GridView, haga click en el botón Advanced para abrir esta ventana, donde seleccionará las dos opciones para incluir en el control SqlDataSource todas las instrucciones SQL que hacen efectivas estas operaciones. Página 10 de 52
11. En la Smart Tag se muestran los checkboxes para que active las operaciones. Seleccione: • Enable Paging, para permitir la paginación. • Enable Sorting, para permitir el ordenado por columna. • Enable Editing, para permitir la edición de datos directamente en el GridView. • Enable Deleting, para permitir la exclusión de datos.12. Si desea editar las columnas, seleccione Edit Columns. Primero deberá “des seleccionar” el tilde campo “Auto generate Columns”, y luego añadir las columnas que desee: Página 11 de 52
13. Puede aplicar el formato que desee en los campos, por ejemplo configure el formato en el campo “ProductNumber para que sea exhibido como numérico, sin decimales (DataFormatString = {0:n0}). Se puede aplicar cualquier formato a las columnas. Página 12 de 52
14. Como fue permitida la edición de datos en el control, personalice los botones al idioma en el que el control será utilizado. Para ello, seleccione el Command Field, localice las propiedades Text de cada botón y modifique el texto. Página 13 de 52
15. Seleccione Auto Format en el Smart Tag, y aplique un formato de acuerdo con su agrado. (en el ejemplo adjunto en el material se utiliza un Theme para la definición del estilo)16. Guarde el proyecto y presione CTRL + F5 para ejecutarlo en el navegador. Es importante destacar que el ASP.NET 2.0 no necesita tener un IIS instalado en la máquina, ya que trabaja con su propio servidor web de desarrollo. Página 14 de 52
El código de este ejercicio se encuentra en el ejemplo adjunto “DCE2005 Acceso a Datos”, enla página “GridView.aspx”, tenga en cuenta que en el ejercicio resuelto se utiliza una “MásterPage y Themes” para dar un formato y estilo amigable. Página 15 de 52
DetailsViewObjetivo: Construir un formulario con el control DetailsView para visualizar ymodificar los registros de la tabla “Employes” de la base de datosAdventureWorks.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. Agregue un nuevo Web Form al Solution Explorer, llámelo DetailsView.aspx. 2. Abra la Toolbox y arrastre un control DetailsView hacia el formulario. Se abrirá una ventana con la Smart Tag para informar la fuente de datos. Seleccione New data source: 3. Informe cuál es la fuente de datos, en este caso es una Database. Página 16 de 52
4. Seleccione la tabla Employees con algunos campos. Página 17 de 52
5. Haga click en el botón Advanced Options y seleccione los dos checkboxes para que sean creados los métodos para soportar la inserción y edición de datos. Página 18 de 52
6. Volviendo al Smart Tag, seleccione todos los checkboxes para activar la paginación y el mantenimiento de datos.7. .Ingrese a la opción “EditFields…” y des seleccione la opción “Auto generate columns”. Del mismo modo que hizo con la grilla, añada los campos que desee por medio de la opción “Add New Field…”8. Personalice el campo “Fecha Finalización” para que quede con el formato de acuerdo con la propiedad DataFormatString, que es {0:dd/MM/yyyy}. El “0:” indica que será el campo actual y el formato viene a continuación. Página 19 de 52
9. Si analiza el código HTML generado, notará que el contenido de la fuente de datos está declarado dentro del HTML a través de la Tag asp:SqlDataSource. Página 20 de 52
<form id="form1" runat="server"><asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True"AutoGenerateRows="False" BackColor="#DEBA84" BorderColor="#DEBA84"BorderStyle="None" BorderWidth="1px" CellPadding="3" CellSpacing="2"DataSourceID="SqlDataSource1" Height="50px" Width="125px"><FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /><EditRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /><RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" /><PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /><Fields><asp:CommandField ShowDeleteButton="True" ShowEditButton="True"ShowInsertButton="True" /><asp:BoundField DataField="ProductId" HeaderText="Codigo"SortExpression="ProductId" /><asp:BoundField DataField="Name" HeaderText="Nombre" SortExpression="Name" /><asp:BoundField DataField="ProductNumber" HeaderText="Producto"SortExpression="ProductNumber" /><asp:BoundField DataField="DaysToManufacture" HeaderText="Demora en Dias"SortExpression="DaysToManufacture" /><asp:BoundField DataField="ListPrice" HeaderText="Precio"SortExpression="ListPrice" /><asp:BoundField DataField="DiscontinuedDate" DataFormatString="{0:dd/MM/yyyy}"HeaderText="Fecha Finalizacion" SortExpression="DiscontinuedDate" /></Fields><HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /></asp:DetailsView><asp:SqlDataSource ID="sqlDataSource" runat="server" ConnectionString="<%$ConnectionStrings:ADVENTUREWORKSConnectionString %>"ConflictDetection="CompareAllValues"SelectCommand="SELECT [ProductID], [Name], [ProductNumber], [Color],[DaysToManufacture], [ListPrice], [DiscontinuedDate] FROM[Production].[Product]"DeleteCommand="DELETE FROM [Production].[Product] WHERE [ProductID] =@original_ProductID AND [Name] = @original_Name AND [ProductNumber] =@original_ProductNumber AND [Color] = @original_Color AND [DaysToManufacture] =@original_DaysToManufacture AND [ListPrice] = @original_ListPrice AND[DiscontinuedDate] = @original_DiscontinuedDate"InsertCommand="INSERT INTO [Production].[Product] ([Name], [ProductNumber],[Color], [DaysToManufacture], [ListPrice], [DiscontinuedDate]) VALUES (@Name,@ProductNumber, @Color, @DaysToManufacture, @ListPrice, @DiscontinuedDate)"OldValuesParameterFormatString="original_{0}"UpdateCommand="UPDATE [Production].[Product] SET [Name] = @Name, [ProductNumber]= @ProductNumber, [Color] = @Color, [DaysToManufacture] = @DaysToManufacture,[ListPrice] = @ListPrice, [DiscontinuedDate] = @DiscontinuedDate WHERE[ProductID] = @original_ProductID AND [Name] = @original_Name AND[ProductNumber] = @original_ProductNumber AND [Color] = @original_Color AND[DaysToManufacture] = @original_DaysToManufacture AND [ListPrice] =@original_ListPrice AND [DiscontinuedDate] = @original_DiscontinuedDate"><DeleteParameters> <asp:Parameter Name="original_EmployeeID"></asp:Parameter> Página 21 de 52
... <asp:Parameter Name="original_Photo"></asp:Parameter> </DeleteParameters> <UpdateParameters> <asp:Parameter Type="String" Name="LastName"></asp:Parameter> ... <asp:Parameter Name="original_Photo"></asp:Parameter> </UpdateParameters> <InsertParameters> <asp:Parameter Type="String" Name="LastName"></asp:Parameter> ... <asp:Parameter Name="Photo"></asp:Parameter> </InsertParameters></asp:SqlDataSource></form> 10. Guarde el proyecto y ejecútelo en el navegador. Incluya un nuevo registro y guárdelo. Enseguida, modifique el contenido y guarde nuevamente. Página 22 de 52
El código de este ejercicio se encuentra en el ejemplo adjunto “DCE2005 Acceso a Datos”, enla página “DetailsView.aspx”. Tenga en cuenta que en el ejercicio resuelto se utiliza una“Master Page” y Themes para dar un formato y estilo amigable. Página 23 de 52
FormViewObjetivo: Construir un formulario con el control FormView para visualizar losregistros de la tabla “Customers” de la base de datos NorthWind.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. Agregue un nuevo Web Form en el Solution Explorer. Arrastre el control FormView hacia el formulario. 2. La fuente de datos será un Database. Seleccione la tabla Customers de la base de datos Northwind y todos los campos. Página 24 de 52
3. Aplique un Auto Format según la opción.4. Ajuste el layout de manera que quepan todos los datos. Página 25 de 52
5. Guarde el proyecto y ejecútelo en el navegador. Navegue en las páginas para visualizar los registros. Página 26 de 52
DataListObjetivo: Construir un formulario con el control DataList. Este controlmuestra diversos registros en la misma página en la que usted debedeterminar el área de datos y el respectivo layout.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. Agregue un nuevo Web Form al Solution Explorer. Arrastre el control DataList hacia el formulario. Como en los ejercicios anteriores seleccione el DataSource, en este caso seleccione la tabla Orders. 2. Configure con AutoFormat para que el control tenga un aspecto de su agrado. 3. Personalice el campo OrderDate para que la fecha sea mostrada en el formato adecuado. Para ello, seleccione el OrderDateLabel y el enlace Edit DataBindings. Configure el formato para Short Date. Página 27 de 52
4. Note que en el HTML, la propiedad clave para exhibir los datos es la Text donde usa el Eval(field).<asp:DataList ID="DataList1" Runat="server“ DataSourceID="SqlDataSource1" RepeatColumns="3"><ItemTemplate> <b>OrderID: </b> <asp:Label ID="OrderIDLabel" Text=<%# Eval("OrderID") %>/> OrderDate: <asp:Label ID="OrderDateLabel" Text=<%# Eval("OrderDate", "{0:d}") ... ShipCountry: <asp:Label ID="ShipCountryLabel" Text=<%# Eval("ShipCountry")%>/> </ItemTemplate></asp:DataList><asp:SqlDataSource ID="SqlDataSource1" Runat="server“ SelectCommand="SELECT [OrderID], [OrderDate], [ShipName], [ShipAddress], [ShipCity], [ShipCountry] FROM [Orders]“ ConnectionString="<%$ ConnectionStrings:AppConnectionString1 %>"></asp:SqlDataSource> Página 28 de 52
5. Guarde el proyecto y ejecútelo en el navegador. Página 29 de 52
Enlazando Datos con ObjetosEnlazando con la capa de acceso a DatosObjetivo: Definir una clase de de Acceso a Datos (DAL) conteniendométodos para acceder a una base de datos que devuelvan un DataSet paraenlazar los datos en los controles que sean necesarios.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. En el Solution Explorer, agregue un nuevo proyecto tipo Class Library llamado DataAccess. 2. Como accederemos al SQL Server, en la primera línea de la pantalla escriba los Namespaces que contienen los métodos y propiedades para efectuar el acceso. En este caso, el namespace que contiene la clase SqlClient, la cual fue creada para manipular datos con SQL Server 7 o superior.VB.NETImports System.DataImports System.Data.SqlClientC#using System.Data;using System.Data.SqlClient; 3. Escriba el método llamado GetCategories que devuelve un DataSet. Este método: • utilizará el string de conexión llamado myConn que está almacenado en el archivo Web.Config; • define una instrucción SQL que selecciona todos los campos de la tabla Categories; • define la conexión y el Command que implementa el Select; • crea un DataAdapter y un DataSet; • completa el DataAdapter en el respectivo DataSet definido y lo devuelve. Mientras tanto, el método GetProducts recibe como argumento el código de la categoría y devuelve un Dataset con los productos de esa categoría. Página 30 de 52
Este código será usado como criterio en la instrucción SQL para investigar todos los productos de la respectiva categoría:VB.NETPublic Class DataAccess Public Shared Function GetCategories() As DataSet Dim conexion As String =ConfigurationSettings.ConnectionStrings(“myConn").ConnectionString() Dim sql As String = "SELECT * FROM Categories" Dim conn As New SqlConnection(conexion) Dim command As New SqlCommand(sql, conn) Dim adapter As New SqlDataAdapter(command) Dim ds As New DataSet adapter.Fill(ds) Return ds End Function Public Shared Function GetProducts(ByVal cat As Integer) As DataSet Dim conexion As String =ConfigurationSettings.ConnectionStrings(“myConn").ConnectionString() Dim conn As New SqlConnection(conexion) Dim command As New SqlCommand() command.Connection = conn command.CommandType = CommandType.Text command.Parameters.Add(New SqlParameter("@cat", cat)) command.CommandText = "SELECT ProductID, ProductName, UnitPrice,UnitsInStock FROM Products WHERE categoryID=@cat" Dim adapter As New SqlDataAdapter(command) Dim ds As New DataSet adapter.Fill(ds) Página 31 de 52
Return ds End FunctionEnd ClassC#public class DataAccess{ public static DataSet GetCategories() { string conexion = "Database=northwind;server=(local);user id=sa "; string sql = "SELECT * FROM Categories"; SqlConnection conn = new SqlConnection(conexion); SqlCommand command = new SqlCommand(sql, conn); SqlDataAdapter adapter = new SqlDataAdapter(command); DataSet ds = new DataSet(); adapter.Fill(ds); return ds; } public static DataSet GetProducts(int cat) { string conexion = "Database=northwind;server=(local);user id=sa"; SqlConnection conn = new SqlConnection(conexion); SqlCommand command = new SqlCommand(); command.Connection = conn; command.CommandType = CommandType.Text; command.Parameters.Add(new SqlParameter("@cat", cat)); command.CommandText = "SELECT ProductID, ProductName, UnitPrice,UnitsInStock FROM Products WHERE categoryID=@cat"; Página 32 de 52
SqlDataAdapter adapter = new SqlDataAdapter(command); DataSet ds = new DataSet(); adapter.Fill(ds); return ds; }} 4. Guarde el proyecto. Agregue un nuevo Web Form en el Solution Explorer. Escriba Categorías y arrastre el control DropDownList hacia el formulario. En la Smart Tag, seleccione el checkbox AutoPostBack para enviar el contenido de este control al servidor. 5. Para la fuente de datos seleccione Object, ya que usaremos la clase definida anteriormente. En caso de que desee alterar el nombre del DataSource, siéntase libre de hacerlo. Página 33 de 52
6. En el Tab Select se muestran todos los métodos existentes. Seleccione el GetCategories y observe que el tipo de retorno es un DataSet. Página 34 de 52
7. Como el control es un DropDownList, escriba CategoryName en “Data Field to Display”, porque es aquí que el campo será exhibido. Por otra parta, el ”Data Field for the Value” es el campo que será almacenado cuando el usuario seleccione un ítem, por lo tanto escriba CategoryID.8. A continuación Construiremos en el formulario un GridView para mostrar todos los productos de la respectiva categoría. Seleccione como Data Source el Object DataAccess y el método GetProducts. Página 35 de 52
9. Como este método requiere un parámetro, hay que especificar que vendrá del control DropDownList1, para esto seleccione en el combo ParameterSource la opción “Control”, y seleccione en el combo “ControlId”, el control que corresponda. Página 36 de 52
10. En la Smart Tag, habilite la paginación y el ordenamiento, y configure el formato para la grilla que sea de su agrado. Página 37 de 52
11. Guarde el proyecto y ejecútelo en el navegador. Seleccione otras categorías y vea que el GridView muestra todos los productos de la categoría seleccionada. Página 38 de 52
Enlazando a una Clase de NegociosObjetivo: Obtener los departamentos de la base de datos AdventureWorkssegún el grupo solicitado por el cliente (se utilizará la tabla “Department”).Definir un componente de negocios que implemente “reglas” a los datosobtenidos del componente de acceso a datos.Implementar el componente dentro de la carpeta virtual “App_Code”.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. En el Solution Explorer, con el botón derecho del Mouse sobre el proyecto agregue la carpeta virtual “App_Code”: Página 39 de 52
2. Dentro de la carpeta generada, incorpore tres clases: “AccesoDatos.cs”, “CapaDeNegocio.cs” y “Departamento.cs”. Veamos primero la clase de acceso a datos://Se incluyen las referencias necesarias, además de las de acceso a//datos y Sql, los namespaces “using System.Collections.Generic” y//“using System.Text” serán utilizados para poder utilizar una lista//generica para la devolucion de datos y un contructor de cadenas para//crear la cadena de consultas.VB.NETImports System.DataImports System.Data.SqlClientImports System.Collections.GenericImports System.TextC#using System.Data;using System.Collections.Generic;using System.Text;using System.Data.SqlClient; 3. En esta clase que simula el componente de acceso a datos, hay que incorporar un método que devuelva los Departamentos por grupos, de acuerdo al requisito. La clase completa se encuentra en el proyecto “DCE2005 Acceso a Datos”, que también posee un método para devolver los grupos en que se dividen los departamentos.VB.NETPublic Function ObtenerDepartamentos(ByVal grupo As String) As List(OfDepartamento) Dim departamentos As List(Of Departamento) = New List(Of Departamento) Dim query As StringBuilder = New StringBuilder query.Append("SELECT ") query.Append("DepartmentID, ") query.Append("Name, ") query.Append("ModifiedDate ") query.Append("FROM [HumanResources].[Department] ") query.AppendFormat("WHERE GroupName = {0} ", grupo) query.Append("Order By Name") Dim command As SqlCommand = New SqlCommand command.CommandText = query.ToString Página 40 de 52
Dim conn As SqlConnection = NewSqlConnection(ConfigurationManager.ConnectionStrings("ADVENTUREWORKSConnectionString").ConnectionString) command.Connection = conn Try conn.Open() Using Dim dr As SqlDataReader = command.ExecuteReader Try If dr.HasRows Then While dr.Read Dim dep As Departamento = NewDepartamento(Convert.ToInt32(dr(0)), dr(1).ToString, grupo,Convert.ToDateTime(dr(2))) departamentos.Add(dep) End While End If Finally CType(dr, IDisposable).Dispose() End Try Catch ex As Exception Throw ex Finally conn.Close() End Try Return departamentosEnd Function Página 41 de 52
C#/// <summary>/// Este metodo obtiene los departamentos por grupos./// </summary>/// <param name="grupo">El grupo seleccionado del combo</param>/// <returns>Una lista de departamentos.</returns>public List<Departamento> ObtenerDepartamentos(string grupo){ List<Departamento> departamentos = new List<Departamento>(); StringBuilder query = new StringBuilder(); query.Append("SELECT "); query.Append("DepartmentID, "); query.Append("Name, "); query.Append("ModifiedDate "); query.Append("FROM [HumanResources].[Department] "); query.AppendFormat("WHERE GroupName = {0} ", grupo); query.Append("Order By Name"); SqlCommand command = new SqlCommand(); command.CommandText = query.ToString(); SqlConnection conn = new SqlConnection( ConfigurationManager.ConnectionStrings[ "ADVENTUREWORKSConnectionString" ].ConnectionString); command.Connection = conn; try { conn.Open(); using (SqlDataReader dr = command.ExecuteReader()) { if (dr.HasRows) { while(dr.Read()) { Departamento dep = new Departamento( Convert.ToInt32( dr[0]), dr[1].ToString(), grupo , Convert.ToDateTime(dr[2]) ); departamentos.Add(dep); } } } } catch (Exception ex) { throw ex; } finally { conn.Close(); } return departamentos; }} Página 42 de 52
4. Otra clase necesaria, para poder desarrollar el método anterior es la clase “Departamento.cs”, esta clase contendrá las propiedades y métodos necesarios para crear el objeto “Departamento” con que se llenará la lista. Puede ver esta clase en el proyecto “DCE2005 Acceso a Datos”. 5. Por último, la clase “CapaDeNegocios”, simula un componente de negocios, en este caso y para simplificar el ejemplo, no se aplican reglas de validación, o propias del negocio, solo se invocan los métodos del componente de acceso a datos. Los accesos se realizan por medio de la clase “AccesoDatos.cs”, que simula una capa de datos, y utiliza la clase Departamento, ya que es con objetos de este tipo en los que se basa el ejercicio. Los métodos más importantes de la capa de negocios, contra los que se enlazaran los datos en los controles son los siguientes:VB.NETPublic Function ObtenerDepartamentosPorGrupo(ByVal grupo As String) As List( ofDepartamento) Definir y agregar las reglas de negocio Dim ad As AccesoDatos = New AccesoDatos Return ad.ObtenerDepartamentos(grupo)End FunctionC#public List<Departamento> ObtenerDepartamentosPorGrupo(string grupo){ //Definir y agregar reglas de negocio AccesoDatos ad = new AccesoDatos(); return ad.ObtenerDepartamentos(grupo);} 6. Una vez armadas las 3 clases, agregue un nuevo Web Form en el Solution Explorer y llámelo “BindingToBusinessLayer”. Con ASP.NET 2.0 puede también arrastrar y pegar los controles en la solapa “Source”, entonces, desde la solapa “Source” incorpore un control “Label”, un control “DropDownList” y un control “GridView”. En el ejercicio resuelto, se esta trabajando con una página maestra y temas, para mantener una interfaz uniforme, además previamente a la incorporación de los controles se incorporo una tabla de html para darle la estructura a la página. En la porción de código copiada aquí, no se incluyen comentarios. Para ver la versión completa con comentarios, vea el ejercicio “DCE2005 Acceso a Datos”, la clase “BindingToBusinessLayer.aspx” Página 43 de 52
Con la utilización del tema a nivel de aplicación, el código html queda más limpio, ya que no es necesario incluir propiedades de estilo (y comportamiento) en el html:ASP .NET<table><tr> <td> <asp:Label ID="lblGrupo" runat="server" CssClass="Label" > Seleccione un grupo:</asp:Label> </td> <td align=left width="83%"> <asp:DropDownList ID="cmbGrupos" runat="server" CssClass="Text" DataSourceID="dsGrupos" AutoPostBack="true"> </asp:DropDownList><br /> </td></tr><tr height="50px"><td></td></tr><tr> <td colspan="2" align=center> <asp:GridView ID="drDepartamentos" runat="server" DataSourceID="dsDepartamentos" AutoGenerateColumns="false"> <Columns> <asp:BoundField HeaderText="Codigo" DataField="DepartamentoID" ItemStyle-HorizontalAlign="right" /> <asp:BoundField HeaderText="Departamento" DataField="Nombre" ItemStyle-HorizontalAlign="Left" /> <asp:BoundField HeaderText="Grupo" DataField="Grupo" ItemStyle-HorizontalAlign="Left" /> <asp:BoundField HeaderText="Fecha" DataField="FechaModificacion" ItemStyle-HorizontalAlign="right" /> </Columns> </asp:GridView> </td></tr></table> Observe que al no permitir que la grilla “auto genere las columnas” (propiedad: AutoGenerateColumns="false"), hay que definir explícitamente cada columna a mostrar. La propiedad DataField, hace referencia al campo que devuelve la consulta a la base de datos, enlazando la información a mostrar en cada columna. 7. Las fuentes de datos utilizadas en el ejercicio, fueron incorporadas del ToolBox, y configuradas como sigue:ASP .NET Página 44 de 52
<!--Control Datasource para llenar la grilla de departamentos. Mediante elparametro se indica la relacion entre el combo y la grilla--><asp:ObjectDataSource ID="dsDepartamentos" runat=server TypeName="Departamentos.CapaDeNegocio" SelectMethod="ObtenerDepartamentosPorGrupo" DataObjectTypeName="Departamentos.Departamento"> <SelectParameters> <asp:ControlParameter DefaultValue="Quality Assurance" Name="grupo" Type="String" ControlID="cmbGrupos" PropertyName="SelectedValue" /> </SelectParameters></asp:ObjectDataSource><!-- Control Datasource para llenar el combo de grupos --><asp:ObjectDataSource ID="dsGrupos" runat="server" TypeName="Departamentos.CapaDeNegocio" SelectMethod="ObtenerGrupos"></asp:ObjectDataSource> 8. Puede ver el código completo en el ejercicio antes mencionado, el resultado es el siguiente:Tenga en cuenta que en la vista de diseño, mediante el smart tag puede configurar elcontrol “ObjectDataSource” seleccionando la clase de la capa de negocios, y los métodospara realizar el enlace de datos a los controles, de manera similar al ejercicio anterior. Página 45 de 52
TREEVIEW + XMLObjetivo: Definir un archivo XML y utilizarlo como fuente de datos para uncontrol TreeView.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. En el Solution Explorer, agregue un nuevo ítem de tipo XML File llamado myXML con la siguiente estructura.<?xml version="1.0" encoding="utf-8" ?><collection> <book> <title>asp.NET</title> <author>dino esposito</author> <publisher>ms press</publisher> </book> <book> <title>sql reporting services</title> <author>tom cruise</author> <publisher>ms press</publisher> </book></collection> 2. Agregue un nuevo Web Form. Arrastre el control TreeView hacia el formulario y asocie como fuente de datos el archivo XML creado anteriormente. Página 46 de 52
3. Defina un Auto Format según la opción para presentar los datos jerárquicos de manera viable. Página 47 de 52
TREEVIEW + DataAdapterObjetivo: Escribir un código que leerá una tabla en el banco de datos,Construir un DataAdapter y completar un control TreeView.NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no necesariamente refleja lasmejores prácticas de Desarrollo y Arquitectura de aplicaciones empresariales establecidas por Microsoft. 1. En el Solution Explorer, Agregue un nuevo formulario conteniendo un control TreeView. Como escribiremos el código directamente en el HTML, en el pie de página, haga click en el botón HTML y escriba el siguiente código que leerá dos tablas (Categories y Products) de la base de datos Northwind, construirá en memoria una relación entre las claves y lo usará como fuente de datos para construir el control TreeView. Como este control requiere datos jerárquicos, entonces construiremos un nivel con las categorías y otro nivel con los productos de las respectivas categorías.VB.NET<%@ Page Language="VB" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server"> Dim conexao As String = "Server=localhost;Database=Northwind;user id=sa" Sub Page_Load() If Not Page.IsPostBack Then FillNodes() End If End Sub Sub FillNodes() Dim ds As DataSet = GetData() For Each masterRow As DataRow In ds.Tables("Categories").Rows Dim masterNode As New TreeNode(masterRow("CategoryName").ToString()) Página 49 de 52
TreeView1.Nodes.Add(masterNode) For Each childRow As DataRow In masterRow.GetChildRows("Children") Dim childNode As NewTreeNode(childRow("ProductName").ToString()) masterNode.ChildNodes.Add(childNode) Next Next End SubFunction GetData() As DataSet Dim conn As SqlConnection = New SqlConnection(conexao) Dim sqlCat As String = "SELECT CategoryID, CategoryName FROM Categories" Dim sqlProd As String = "SELECT CategoryID, ProductName FROM Products" Dim daCat As SqlDataAdapter = New SqlDataAdapter(sqlCat, conn) Dim daProd As SqlDataAdapter = New SqlDataAdapter(sqlProd, conn) Dim ds As DataSet = New DataSet() daCat.Fill(ds, "Categories") daProd.Fill(ds, "Products") ds.Relations.Add("Children", _ ds.Tables("Categories").Columns("CategoryID"), _ ds.Tables("Products").Columns("CategoryID")) Return dsEnd Function</script>C#<%@ Page Language="C#" %> Página 50 de 52
<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server"> const string connString = "Server=localhost;Database=Northwind;user id=sa"; void Page_Load() { if (! Page.IsPostBack) FillNodes(); } void FillNodes() { DataSet dst = GetData(); foreach (DataRow masterRow in dst.Tables["Categories"].Rows) { TreeNode masterNode = newTreeNode((string)masterRow["CategoryName"]); TreeView1.Nodes.Add(masterNode); foreach (DataRow childRow in masterRow.GetChildRows("Children")) { TreeNode childNode = newTreeNode((string)childRow["ProductName"]); masterNode.ChildNodes.Add(childNode); } } }DataSet GetData() Página 51 de 52
{ SqlConnection conn = new SqlConnection(connString); string sqlCat = "Select CategoryID, CategoryName FROM Categories"; string sqlProd = "Select CategoryID, ProductName FROM Products"; SqlDataAdapter daCat = new SqlDataAdapter(sqlCat, conn); SqlDataAdapter daProd = new SqlDataAdapter(sqlProd, conn); DataSet ds = new DataSet(); daCat.Fill(ds, "Categories"); daProd.Fill(ds, "Products"); ds.Relations.Add("Children", ds.Tables["Categories"].Columns["CategoryID"], ds.Tables["Products"].Columns["CategoryID"]); return ds; }</script> Página 52 de 52

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución