Escolar Documentos
Profissional Documentos
Cultura Documentos
PROGRAMACION EN CAPAS
CON C#
Tomado de varios documentos publicados en la Internet
Antologia
Contenido
No se encontraron elementos de tabla de contenido.
Pg.:2
Antologia
Pg.:3
Antologia
aplicacin?", pronto lo veremos con unos ejemplos por ahora continuaremos con la
teoria.
La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios
niveles y, en caso de que sobrevenga algn cambio, solo se ataca al nivel requerido sin
tener que revisar entre cdigo mezclado. Un buen ejemplo de este mtodo de
programacin sera el modelo de interconexin de sistemas abiertos.
Adems, permite distribuir el trabajo de creacin de una aplicacin por niveles; de este
modo, cada grupo de trabajo est totalmente abstrado del resto de niveles, de forma
que basta con conocer la API que existe entre niveles.
En el diseo de sistemas informticos actual se suelen usar las arquitecturas multinivel
o Programacin por capas. En dichas arquitecturas a cada nivel se le confa una misin
simple, lo que permite el diseo de arquitecturas escalables (que pueden ampliarse con
facilidad en caso de que las necesidades aumenten).
El ms utilizado actualmente es el diseo en tres niveles (o en tres capas)
Pg.:4
Antologia
Pg.:5
Antologia
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen
en un solo computador (Presentacin+lgica+datos). Se dice que la arquitectura
de la solucin es de tres capas y un nivel.
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen
en
dos
servidores o
Pg.:6
Antologia
2.1 Datos
Leer y grabara los datos en un archivo de texto.
2.2 Negocio
Entregar los datos al encargado de la interaccin con el usuario y se encarga de las
validaciones que sern dos:
Un botn Cargar
Un botn Guardar
2.4 Ejemplo.
Una vez definida las responsabilidades, es necesario tener en cuenta que hay un
elemento que los tres responsables deben conocer. Me refiero a la "persona" o mejor
dicho a sus datos, est claro que el encargado de datos debe saber que grabar y que
Pg.:7
Antologia
leer, el encargado de negocios debe saber sobre que aplicar las reglas de negocio y el
encargado de la interaccin con el usuario debe saber que datos mostrar o pedir.
El siguiente diagrama ilustra lo anterior:
Pg.:8
Antologia
2.4.1 Presentacin:
namespace EjemploTresCapas
{
partial class Presentacion
{
/// <summary>
///
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Limpiar los recursos que se estn utilizando.
/// </summary>
/// <param name="disposing">true si los recursos administrados se deben
eliminar; false en caso contrario.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Cdigo generado por el Diseador de Windows Forms
/// <summary>
/// Mtodo necesario para admitir el Diseador. No se puede modificar
/// el contenido del mtodo con el editor de cdigo.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.dgPersona = new System.Windows.Forms.DataGridView();
this.nombreDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
this.telefonoDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
Pg.:9
Antologia
this.emailDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
this.personaBindingSource = new
System.Windows.Forms.BindingSource(this.components);
this.btnCargar = new System.Windows.Forms.Button();
this.btnGrabar = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dgPersona)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.personaBindingSource)).BeginInit();
this.SuspendLayout();
//
// dgPersona
//
this.dgPersona.AllowUserToOrderColumns = true;
this.dgPersona.Anchor =
((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dgPersona.AutoGenerateColumns = false;
this.dgPersona.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgPersona.Columns.AddRange(new
System.Windows.Forms.DataGridViewColumn[] {
this.nombreDataGridViewTextBoxColumn,
this.telefonoDataGridViewTextBoxColumn,
this.emailDataGridViewTextBoxColumn});
this.dgPersona.DataSource = this.personaBindingSource;
this.dgPersona.Location = new System.Drawing.Point(0, 0);
this.dgPersona.Name = "dgPersona";
this.dgPersona.Size = new System.Drawing.Size(737, 368);
this.dgPersona.TabIndex = 0;
//
// nombreDataGridViewTextBoxColumn
//
this.nombreDataGridViewTextBoxColumn.DataPropertyName = "Nombre";
this.nombreDataGridViewTextBoxColumn.HeaderText = "Nombre";
this.nombreDataGridViewTextBoxColumn.Name =
"nombreDataGridViewTextBoxColumn";
Pg.:10
Antologia
//
// telefonoDataGridViewTextBoxColumn
//
this.telefonoDataGridViewTextBoxColumn.DataPropertyName = "Telefono";
this.telefonoDataGridViewTextBoxColumn.HeaderText = "Telefono";
this.telefonoDataGridViewTextBoxColumn.Name =
"telefonoDataGridViewTextBoxColumn";
//
// emailDataGridViewTextBoxColumn
//
this.emailDataGridViewTextBoxColumn.DataPropertyName = "Email";
this.emailDataGridViewTextBoxColumn.HeaderText = "Email";
this.emailDataGridViewTextBoxColumn.Name =
"emailDataGridViewTextBoxColumn";
//
// personaBindingSource
//
this.personaBindingSource.DataSource =
typeof(EjemploTresCapas.Entidad.Persona);
//
// btnCargar
//
this.btnCargar.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.btnCargar.Location = new System.Drawing.Point(569, 374);
this.btnCargar.Name = "btnCargar";
this.btnCargar.Size = new System.Drawing.Size(75, 23);
this.btnCargar.TabIndex = 1;
this.btnCargar.Text = "Cargar";
this.btnCargar.UseVisualStyleBackColor = true;
this.btnCargar.Click += new System.EventHandler(this.btnCargar_Click);
//
// btnGrabar
//
this.btnGrabar.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.btnGrabar.Location = new System.Drawing.Point(650, 374);
Pg.:11
Antologia
this.btnGrabar.Name = "btnGrabar";
this.btnGrabar.Size = new System.Drawing.Size(75, 23);
this.btnGrabar.TabIndex = 2;
this.btnGrabar.Text = "Grabar";
this.btnGrabar.UseVisualStyleBackColor = true;
this.btnGrabar.Click += new System.EventHandler(this.btnGrabar_Click);
//
// Presentacion
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(737, 404);
this.Controls.Add(this.btnGrabar);
this.Controls.Add(this.btnCargar);
this.Controls.Add(this.dgPersona);
this.Name = "Presentacion";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dgPersona)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.personaBindingSource)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView dgPersona;
private System.Windows.Forms.Button btnCargar;
private System.Windows.Forms.Button btnGrabar;
private System.Windows.Forms.DataGridViewTextBoxColumn
nombreDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn
telefonoDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn
emailDataGridViewTextBoxColumn;
private System.Windows.Forms.BindingSource personaBindingSource;
}
}
Pg.:12
Antologia
using EjemploTresCapas.Entidad;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Windows.Forms;
namespace EjemploTresCapas
{
public partial class Presentacion : Form
{
private Negocio.Negocio _negocio;
public Presentacion()
{
InitializeComponent();
_negocio = new
Negocio.Negocio(ConfigurationManager.AppSettings["ArchivoDatos"]);
personaBindingSource.DataSource = new List<Persona>();
}
private void btnCargar_Click(object sender, EventArgs e)
{
try
{
personaBindingSource.DataSource = _negocio.Leer();
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
private void btnGrabar_Click(object sender, EventArgs e)
{
try
{
if (personaBindingSource.DataSource != null &&
personaBindingSource.DataSource is List<Persona>)
_negocio.Grabar(personaBindingSource.DataSource as List<Persona>);
}
Pg.:13
Antologia
2.4.2 Negocio:
using EjemploTresCapas.Dato;
using EjemploTresCapas.Entidad;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
namespace EjemploTresCapas.Negocio
{
public class Negocio
{
private bool _emailInvalido;
private Datos _dao;
public Negocio(string nombreArchivo)
{
this._dao = Datos.Instancia(nombreArchivo);
}
public List<Persona> Leer()
{
return this._dao.Leer();
}
public void Grabar(List<Persona> datos)
{
foreach (Persona item in datos)
{
if (string.IsNullOrWhiteSpace(item.Nombre))
throw new Exception("El nombre de la persona no puede ser
vacio.");
Pg.:14
Antologia
Pg.:15
Antologia
return false;
}
}
private string DomainMapper(Match match)
{
// IdnMapping class with default property values.
IdnMapping idn = new IdnMapping();
string domainName = match.Groups[2].Value;
try
{
domainName = idn.GetAscii(domainName);
}
catch (ArgumentException)
{
_emailInvalido = true;
}
return match.Groups[1].Value + domainName;
}
}
}
2.4.3 Dato:
using EjemploTresCapas.Entidad;
using System.Collections.Generic;
using System.IO;
namespace EjemploTresCapas.Dato
{
public class Datos
{
private static Datos datos;
public string NombreArchivo { get; private set; }
public static Datos Instancia(string nombreArchivo)
{
if (datos == null)
datos = new Datos(nombreArchivo);
Pg.:16
Antologia
return datos;
}
private Datos()
{
}
private Datos(string nombreArchivo)
{
this.NombreArchivo = nombreArchivo;
}
public List<Persona> Leer()
{
List<Persona> datos = new List<Persona>();
if (File.Exists(NombreArchivo))
{
using (StreamReader sr = new StreamReader(NombreArchivo))
{
while (!sr.EndOfStream)
{
string[] arrDatos = sr.ReadLine().Split(';');
datos.Add(new Persona(arrDatos[0], arrDatos[1],
arrDatos[2]));
}
sr.Close();
}
}
else
throw new FileNotFoundException("No se encontr el archivo " +
NombreArchivo);
return datos;
}
public void Grabar(List<Persona> datos)
{
using (StreamWriter sr = new StreamWriter(NombreArchivo, false))
Pg.:17
Antologia
{
foreach (Persona item in datos)
sr.WriteLine(item.ToString());
sr.Flush();
sr.Close();
}
}
}
}
2.4.4 Entidad:
namespace EjemploTresCapas.Entidad
{
public class Persona
{
public string Nombre { get; set; }
public string Telefono { get; set; }
public string Email { get; set; }
public Persona() : this (string.Empty,string.Empty,string.Empty)
{
}
public Persona(string nombre, string telefono, string email)
{
this.Nombre = nombre;
this.Telefono = telefono;
this.Email = email;
}
public override string ToString()
{
return string.Format("{0};{1};{2}", Nombre, Telefono, Email);
}
}
}
Les dejo como tarea, cambiar la capa de datos por una en la cual los datos sean
guardados en una base de datos o en un archivo XML.
Pg.:18
Antologia
Para terminar, me queda sealar que si bien en el ejemplo pusimos la validacin del
nombre obligatorio como parte de nuestro negocio, esta responsabilidad podra
trasladarse a la presentacin, esto se debe a que es comn en los lenguajes modernos
tener controles inteligentes que, por ejemplo, obligan a ingresar datos, formatean
cuadros de texto, realizan validaciones de forma, etc. La decisin de donde poner cada
responsabilidad depender de la aplicacin que se est desarrollando.
Los
mtodos
de
validacin
del
correo
electrnico
se
obtuvieron
desde
Pg.:19
Antologia
y vuelve a
Pg.:20
Antologia
Para crear la cadena solo debemos substituir los datos mostrados en la imagen anterior
aqui dejo la cadena para que no exista confusion a la hora de transcibir
@"Data Source=???????????;Initial Catalog=??????;User ID=sa;Password=????????"
Nuestra ultima duda para la cadena de conexion es Initial Catalog la cual para efectos
de este ejemplo le asignaremos Empleados entonces nuestra cadena quedaria de la
siguiente manera
@"Data Source=???????????;Initial Catalog=Empleados;User ID=sa;Password=????????"
Pg.:21
Antologia
Este script crea la una tabla llamada Datos la cual tiene 4 campos:
1. id: es la llave primaria, es de tipo entero y no acepta valores nulos, y sirve para
darle un identificar al empleado.
2. strNombre: es de tipo varchar con capacidad para 20 caracteres el cual nos
sirve para almacenar el nombre del empleado.
3. strApellido: es de tipo varchar con capacidad para 20 caracteres el cual nos
sirve para almacenar el apellido del empleado.
4. intEdad: es de tipo entero de capacidad para guardar valores de hasta 127 el
cual nos sirve para almacenar la edad del empleado.
Pg.:22
Antologia
Ahora ya con la tabla Datos vamos a hacerlo un poco mas interesante, crearemos un
procedimiento almacenado para que nuestro programa pueda guardar los datos
introducidos desde la capa de presentacion.
En SQL escribimos el siguiente script para crear nuestro procedimiento y presionamos
F5
create proc insDatos
(
@nombre varchar(20),
@apellido varchar(20),
@edad int
)
as insert into Datos values(@nombre,@apellido,@edad)
solo necesitamos saber los el tipo de argumentos que toma y el nombre del
procedimiento. Ahora solo nos falta verificar que el registro se haya incluido en nuestra
base de datos eso lo realizamos con lo siguiente seguido de un F5
select * from Datos
Con esto sql nos presentara en la ventana Results que se muestra en la imagen de
bajo, con los datos que corresponden a la insercion realizada por nuestro
procedimiento.
Pg.:23
Antologia
Si lo deseas y tienes experiencia con scripts aqui pongo todo lo que se necesita para
nuestro ejemplo, un simple copy/paste realizara todo lo necesario
create database Empleados
GO
use Empleados
GO
create table Datos
(
id int identity primary key not null,
strNombre varchar(20),
strApellido varchar(20),
intEdad tinyint
)
GO
create proc insDatos
(
@nombre varchar(20),
@apellido varchar(20),
@edad int
)
as insert into Datos values(@nombre,@apellido,@edad)
GO
exec insDatos 'Juan','Perez',23
GO
select * from Datos
GO
Pg.:24
Antologia
Ahora en Visual Studio nos presenta una clase llamada Class1.cs que nosotros no
pedimos, por lo que la eliminaremos, haciendo click derecho sobre la clase en el
explorador de soluciones y seleccionaremos eliminar, a continuacion Visual Studio nos
pedira una confirmacion a la cual aceptaremos.
Ahora crearemos una clase llamada Configuracion en la cual pondremos nuesta cadena
de conexion que anteriormente generamos para ello en el explorador de soluciones
seleccionaremos el proyecto Datos y le haremos un click derecho para que nos muestre
las opciones en ellas seleccionaremos agregar y por ultimo en el menu emergente
seleccionaremos clase, todo el proceso se muestra en la siguiente imagen
Pg.:25
Antologia
El paso anterior nos llevara a una pantalla donde se muestra todos los elementos que
Visual Studio puede agregar a nuestro proyecto, pero como hemos elegido agregar una
clase, Visual Studio tiene todo seleccionado por nosotros lo unico que hay que hacer en
este paso es escribir el nombre de nuestra clase la cual llamaremos Configuracion en el
cuadro de texto y dar click en agregar, a continuacion se muestra una imagen del
proceso.
Pg.:26
Antologia
Ahora Visual Studio nos muestra la estructura basica de nuestro programa, para hacer
nuestra clase de configuracion tenemos que hacer publica nuestra clase agregandole la
palabra reservada public antes de class y acontinuacion creamos una cadena de
caracteres que contendra la cadena de conexion antes creada, y con esto ya
establecido le crearemos un metodo a la clase Configuracion el cual se llamara
CadenaConexion, y se encargara de proporcionar la cadena de conexion a cualquier
proceso que la necesite, el codigo siguiente muestra como deberia de quedar nuestra
clase y abajo se muestra una imagen de la clase en Visual Studio.
public class Configuracion
{
static string cadenaConexion =
@"Data Source=???;Initial Catalog=Empleados;User ID=sa;Password=???";
public static string CadenaConexion
{
get { return cadenaConexion; }
}
}
Pg.:27
Antologia
En el dado caso que se desee acceder con autentificacion de windows lo que se tiene
que hacer es agregar Trusted_Connection=true o Integrated Security=SSPI a la linea de
conexion en vez de el usuario y el password.
El siguiente paso es agregar otra clase de la misma manera que lo hicimos con
Configuracion, pero esta vez nuestra clase se llamara MetodosDatos, esta clase tendra
la tarea de acceder a la base de datos para que los metodos puedan obtener la
informacion de nuestra base de datos.
Al igual que configuracion le agregaremos la propiedad de public, pero ademas a esta
clase le agregaremos dos referencias.
using System.Data.SqlClient;
using System.Data;
Las cuales se insertan antes del namespace estas referencias nos sirven para llamar
metodos ya establecidos en C#, A continuacion agregaremos los siguientes tres
mtodos:
CrearComando
Este metodo nos servira para crear un comando sql estandard como un select el cual
sera regresado por su metodo return
Pg.:28
Antologia
CrearComandoProc
Este metodo al igual que el anterior nos crea un comando sql, pero con la diferencia
que este metodo nos creara nuestro comando de manera que pueda ejecutar nuestro
procedimiento almacenado que establecimos anteriormente llamado InsDatos.
public static SqlCommand CrearComandoProc()
{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection(_cadenaConexion);
SqlCommand _comando = new SqlCommand("InsDatos", _conexion);
_comando.CommandType = CommandType.StoredProcedure;
return _comando;
}
EjecutarComandoInsert
Este metodo obtiene como parametro un comando sql que proviene de el metodo
anterior CrearComandoProc, este metodo ejecuta el procedimineto almacenado que se
le ha asignado al comando. En la siguiente clase que agregaremos veremos como se le
asigna el procedimiento almacenado a este comando.
public static int EjecutarComandoInsert(SqlCommand comando)
{
Try
{
comando.Connection.Open();
return comando.ExecuteNonQuery();
}
Pg.:29
Antologia
catch { throw; }
finally
{
comando.Connection.Dispose();
comando.Connection.Close();
}
}
EjecutarComandoSelect
Este metodo ejecutara un comando select el cual nos regresara un datatable con todos
los registros que se encuentren en alguna tabla dada, toma como parametro el
comando que contiene la sentencia sql select.
public static DataTable EjecutarComandoSelect(SqlCommand comando)
{
DataTable _tabla = new DataTable();
try{
comando.Connection.Open();
SqlDataAdapter adaptador = new SqlDataAdapter();
adaptador.SelectCommand = comando;
adaptador.Fill(_tabla);
}
catch (Exception ex)
{ throw ex; }
finally
{ comando.Connection.Close(); }
return _tabla;
}
Pg.:30
Antologia
ObtenerEmpleados
Esta clase obtiene un comando del metodo CrearComando de la Clase Metodos Datos
lo almacena en _comando y despues le agrega la sentencia a ejecutar y por medio de
el metodo EjecutarComandoSelect la ejecuta y nos regresa un DataTable que es un
objeto de datos que contiene la estructura de una tabla (filas, columnas, registros, etc).
public static DataTable ObtenerEmpleados()
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM Datos";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
Pg.:31
Antologia
Con esto hemos terminado con nuestra capa de datos es hora de crear nuestra capa de
negocio.
Pg.:32
Antologia
El metodo Insert recibe los parametros Nombre, Apellido y Edad y los envia por medio
de una instancia de AccesoDatos a su metodo Insert.
public int Insert(string Nombre, string Apellido, int Edad)
{
AccesoDatos acceso = new AccesoDatos();
return acceso.Insert(Nombre, Apellido, Edad);
}
Con esto terminamos nuestra capa de Negocio y continuamos con nuestra ultima capa
la capa de Presentacion.
Pg.:33
Antologia
Ahora apartir de esto empezaremos a agregar los elementos que necesitaremos para
nuestra ultima capa, Para empezar cambiaremos el titulo de la pagina modificandole el
title, le pondremos Tres Capas como titulo como se muestra acontinuacion
<title>Tres Capas</title>
Pg.:34
Antologia
</div>
Despues de haber agregado nuestra etiqueta debajo de ella agregaremos una tabla la
cual contendra 7 filas.
<asp:Label ID="lblMensaje" runat="Server" ForeColor="red" EnableViewState="False"/>
<table style="border:2px solid #cccccc;">
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
</table>
Fila 2: Esta fila contendra tres columnas identificadas por la etiqueta <td> en la primera
columna se mostrara el mensaje Nombre para hacer referencia a el parametro
necesario para obtener el nombre, en la segunda columna, se colocara un textbox para
que el usuario introduzca el nombre a guardar en la base de datos el cual tendra el
nombre de txtNombre, la ultima columna contiene un validador de nombre val1 que
tendra la funcion de avisar al usuario que ha cometido un error al ingresar datos en
txtNombre.
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox ID="txtNombre" runat="Server"></asp:TextBox>
Pg.:35
Antologia
</td>
<td>
<asp:RequiredFieldValidator ID="val1" runat="Server" Text="*"
ControlToValidate="txtNombre"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
Fila 3: Al igual que la fila anterior tiene 3 columnas, en la primera columna el mensaje
nombre en la segunda un textbox el con el nombre de txtApellido el cual nos provee de
el apellido a guardar en la base de datos y por ultimo en la columna 3 un validador de
nombre val2 el cual se encarga de verificar que el usuario indroduzca valores correctos
en txtApellido.
<tr>
<td>
Apellido:
</td>
<td>
<asp:TextBox ID="txtApellido" runat="Server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val2" runat="Server" Text="*"
ControlToValidate="txtApellido"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
Pg.:36
Antologia
Fila 5: La fila cinco contendra dos botones uno nos servira para tomar la informacion
recolectada de los textbox y enviarla a la base de datos, el otro boton nos servira para
recibir todos los registros contenidos en la base de datos, los cuales tendran un evento
OnClick llamados Agregar y gvMostrar respectivamente.
<tr>
<td>&nbsp;</td>
<td>
<asp:Button ID="btnEnviar" runat="server" Text="Enviar" OnClick="Agregar" />
</td>
<td>
<asp:Button ID="Load" runat="server" Text="Mostrar" OnClick="gvMostrar" />
</td>
</tr>
Fila 6:Esta fila solo servira para separar a los botones de la fila 5 con el gridview de la
fila 7.
<tr>
<td/>
</tr>
Fila 7: En esta fila se encuentra el GridView que contendra los datos que previamente
se habran ido agregando a nuestra base de datos. En este GridView se tienen que
identificar los nombres de los campos que se quieren mostrar en la propiedad
BoundField DataField y en la propiedad de HeaderText tenemos el nombre de el campo
a mostrar en nuestra aplicacion.
<td colspan="3" align=center>
<asp:GridView ID="GridView" runat="server" AutoGenerateColumns="false">
<Columns>
Pg.:37
Antologia
Pg.:38
Antologia
Apellido:
</td>
<td>
<asp:TextBox ID="txtApellido" runat="Server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val2" runat="Server" Text="*"
ControlToValidate="txtApellido"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
Edad:
</td>
<td>
<asp:TextBox ID="txtEdad" runat="Server"
Columns="4"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val3" runat="Server" Text="*"
ControlToValidate="txtEdad"
Display="dynamic"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="Comp" runat="Server" Text="Solo
Enteros" ControlToValidate="txtEdad"
Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<asp:Button ID="btnEnviar" runat="server" Text="Enviar"
OnClick="Agregar" />
</td>
<td>
<asp:Button ID="Load" runat="server" Text="Mostrar"
OnClick="gvMostrar" />
</td>
</tr>
Pg.:39
Antologia
<tr>
<td/>
</tr>
<tr>
<td colspan="3" align=center>
<asp:GridView ID="GridView" runat="server"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="id" HeaderText="Id" />
<asp:BoundField DataField="strNombre"
HeaderText="Nombre" />
<asp:BoundField DataField="strApellido"
HeaderText="Apellido" />
<asp:BoundField DataField="intEdad"
HeaderText="Edad" />
</Columns>
</asp:GridView>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Pg.:40
Antologia
Enseguida agregaremos una clase llamada Agregar la cual es un evento del botn
Enviar que se encuentra en la fila 5 de nuestra pagina, esta clase sera la encargada de
realizar todo el proceso de insertar un registro en la base de datos, utilizando todo lo
que hemos construido hasta ahora.
Esta clase funciona de la siguiente manera, verifica que los datos ingresados estn
correctos de lo contrario se aborta y sale de la ejecucin, en caso de que no se
encuentren errores, se crea una instancia de la clase AccesoLogica que proviene de
nuestra capa de Negocios, a esta instancia se le da el nombre de negocio, despus se
asignan
una
variable
los cuales
ejemploeriormente nos sirven para pasar los parmetros requeridos para una insercin
en nuestra capa de negocio por medio de su mtodo insert el cual devuelve un
resultado, el cual sera negativo en caso de que ocurra un error en la base de datos. y a
continuacion se manda un mensaje por medio de la etiqueta lblMensaje en caso de que
exista o no error en la insercin, por ultimo se libera la memoria de la instancia negocio.
protected void Agregar(object sender, EventArgs e)
{
if (!Page.IsValid)
return;
AccesoLogica negocio = new AccesoLogica();
string nombre = txtNombre.Text;
string apellido = txtApellido.Text;
int edad = Int32.Parse(txtEdad.Text);
int resultado = negocio.Insert(nombre,apellido,edad);
if (resultado > 0)
Pg.:41
Antologia
otro";
negocio = null;
}
Ahora agregaremos otra clase llamada gvMostrar la cual, al igual que la anterior se
ejecutara al hacer click en el botn Mostrar, esta clase tendr la tarea de llenar el
GridView con los datos contenidos en la base de datos, para ello obtiene sus datos de
la clase proveniente AccesoLogica llamada ObtenerEmpleados, el cual se le asigna
como DataSource a nuestro GridView y despus se le liga a el GridView con la funcin
DataBind, por ultimo se deshace de todos los datos contenidos en los textbox.
protected void gvMostrar(object sender, EventArgs e)
{
GridView.DataSource = AccesoLogica.ObtenerEmpleados();
GridView.DataBind();
txtEdad.Text = txtNombre.Text = txtApellido.Text = "";
}
Pg.:42