Introducción
En esta ocasión se implementara al versión web de un articulo previo:
[WinForms] Edición Empleados – Grabar imagen en base de datos
Los puntos que se trataran con detalle serán:
- selección de un fila en el gridview
- eliminar un registro del grid
- visualizar una imagen que se encuentra dentro de la base de datos en un control de Image
1 – Selección de una fila en el GridView
Existen varias formas de lograr este objetivo, en el ejemplo del este articulo aplique solo una de ellas haciendo uso del CommandField para definir las acciones sobre el grid, para ello hice uso de la opción visual:
esto desplegara el dialogo:
es aquí donde se definen las columnas entre ellas el CommandField, al seleccionarlo mostrara las propiedades de configuración, las propiedades de la sección “Behavior” es donde uno selecciona que botones quiere visualizar, es por eso que en este caso la propiedad “ShowSelecteButton” esta en True.
Además es importante la sección “Appearance” en donde se define “ButtonType” del tipo imagen y el “SelectImageUrl”, con la url del botones que se ve en el grid.
Concluida la definición de columnas y botones de acción, se debe especificar una propiedad muy importante en el grid, se trata del “DataKeyNames”, esta debería llevar el nombre la propiedad (o columna) del origen de datos que se usara como identificación de la entidad que se edita, en este caso como son empleado, será su id, definiéndose: DataKeyNames="IdEmpleado"
Este paso es importante ya que en los eventos se podrá recuperar sobre que entidad se debe aplicar la acción.
El botón de selección lanzara el evento “SelectedIndexChanging”, es por eso que será necesario definirlo en el grid: onselectedindexchanging="gvEmpleados_SelectedIndexChanging"
mientras que en el código de la pagina:
protected void gvEmpleados_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) { int idempleado = Convert.ToInt32(gvEmpleados.DataKeys[e.NewSelectedIndex].Value); Response.Redirect(string.Format("EditarEmpleado.aspx?id={0}", idempleado)); }
Se hace uso del DataKeys para tomar el valor definido por el DataKeyNames, estas dos propiedades trabajan bien relacionadas entre ellas.
Lo último paso que queda es redireccionar a la pagina de edición.
2- Eliminar un registro
La operación de eliminar es muy parecida a la selección, solo cambia el comando usado para esto.
Al igual que la selección hay que configurar el CommandField habilitando la propiedad “ShowDeleteButton” en true.
Esta acción lanzara el evento “RowDeleting”, para lo cual especificamos su definición en el grid mediante: onrowdeleting="gvEmpleados_RowDeleting"
y luego en el código:
protected void gvEmpleados_RowDeleting(object sender, GridViewDeleteEventArgs e) { int idempleado = Convert.ToInt32(gvEmpleados.DataKeys[e.RowIndex].Value); EmpleadosDAL.Eliminar(idempleado); CargarGrid(); //luego de eliminar se recarga el grid }
Aquí también se hace uso del DataKeys para recuperar el id de la entidad que lanzo la acción.
3- Visualizar imagen
Cuando la imagen se encuentra dentro de la base de datos es necesario usar un intermediario para poder asignarla al control Image, y se haga visible al usuario.
Además todo esto sin generar archivos temporales que permitan el acceso a la imagen.
En este caso es el handler quien nos brinda esta ayuda, si se observa el código del mismo se ve muy simple, se recupera la entidad del empleado, y a continuación si contiene una imagen asociada se poniéndola en el Response, sino hay imagen se envía una por defecto, la cual indicara que no esta disponible (líneas: 21-23).
public class HttpImageHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { // // Se recupera la entidad empleado // int id = Convert.ToInt32(context.Request.Params["id"]); EmpleadoEntity empleado = EmpleadosDAL.ObtenerById(id); // // Arma el contexto que enviara la imagen en el response // se usa el nombre del empleado para el nombre del archivo que se envia // context.Response.Clear(); context.Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", empleado.Nombre)); context.Response.ContentType = "image/jpg"; byte[] imagenEmpleado = empleado.Imagen; if (empleado.Imagen == null) imagenEmpleado = File.ReadAllBytes(context.Server.MapPath("Imagenes/NoDisponible.jpg")); // // Se escribe en el response la imagen asociada al empleado // context.Response.BinaryWrite(imagenEmpleado); context.Response.End(); } public bool IsReusable { get { return false; } } }
Esto es tanto usado por el grid para recuperar las imágenes que lista, como así también por cualquier otro control individual que necesites mostrar la imagen del empleado.
Es por eso que en el webform “EditarEmpleado.aspx”, cuando se carga el empleado todos sus datos se asignan directo a los controles, menos el control Image que recibe una url al handler para que tome de allí la imagen que debe mostrar (línea: 18)
private void CargarEmpleado(int id) { EmpleadoEntity empleado = EmpleadosDAL.ObtenerById(id); if (empleado == null) { imgEmpleado.ImageUrl = "Imagenes/NoDisponible.jpg"; return; } lblIdEmpleado.Text = Convert.ToString(empleado.IdEmpleado); txtNombre.Text = empleado.Nombre; txtApellido.Text = empleado.Apellido; txtFechaNacimiento.Text = empleado.FechaNacimiento.ToShortDateString(); AsignarEstudios(empleado); imgEmpleado.ImageUrl = string.Format("imagen.ashx?id={0}", id); }
Código del artículo
El ejemplo fue desarrollado con Visual Studio 2008, y base de datos Sql Server 2008 R2 Express.
Dentro de la carpeta “script” del proyecto “DataAccess” encontrara un archivo .sql que define la estructura de datos.
[C#]
|
[VB.NET]
|