Introducción
Al desplegar una tabla de información al usuario es muy común proporcionar acciones sobre los registros, en este caso no centraremos en el uso del GridView el cual aplicara ciertas condiciones sobre estas acciones.
Se trabajar con una lista de Productos a los cuales se podrá realizar acciones.
Las reglas que se aplican son:
- Si cantidad de stock esta en cero mostrara el link de “Order” para poder solicitar la compra.
- Si el producto esta discontinuo se mostrara el icono en la columna “Discontinued”
- Si el producto esta discontinuo no se permitirá editar el producto
Ocultar las acciones dinámicamente
Para lograr el objetivo usaremos un único evento, el RowDataBound, el cual se lanzara por cada row que sea generada en el grid.
El código completo seria:
protected void gvProducts_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType != DataControlRowType.DataRow) return; //se recupera la entidad que genera la row Product prod = e.Row.DataItem as Product; //se valida que el stock esta en cero //para remover el link de la primer columna if (prod.UnitsInStock != 0) e.Row.Cells[0].Controls.Clear(); //se verifica si el producto esta discontinuo //removiendo el icono de la columna Discontinued if (!prod.Discontinued) e.Row.Cells[1].Controls.Clear(); //se verifica si el producto esta discontinuo //para quitar el boton de edicion if (prod.Discontinued) { ImageButton img = e.Row.FindControl("imgEdit") as ImageButton; e.Row.Cells[7].Controls.Remove(img); } //esta es equivalente a la opcion anterior //que remueve la imagen de edicion //if (prod.Discontinued) //{ // e.Row.Cells[7].Controls.RemoveAt(1); //} }
Ahora vamos a analizarlos por partes
Línea 7 : El uso del e.Row.DataItem permite recuperar la entidad concreta del origen de datos para poder usarla en la evaluación, con esta se puede acceder a propiedades de la entidad sin necesidad de haber definido una columna en el grid. En este caso se utiliza una entidad creada por uno, pero si se utilizara un DataTable se debe castear a un DataRowView.
Líneas 11-12: verifica el stock y remueve el control Link de la celda
Líneas 16-17: valida la propiedad Discontinued y remueve la imagen cuando el producto esta activo.
Líneas 21-25: hace uso de la propiedad Discontinued para conocer si debe evitar que el producto pueda ser editado.
Líneas 29-32: implementan la misma funcionalidad que las líneas 21-25, solo es otra forma de lograr lo mismo, pero sin tener que buscar el ImageButton
Código
Se requiere VS 2010 y Sql Server 2008 R2
[C#]
|
Hola Leandro Tutinni, estoy aprendiendo a utilizar sql, tengo un problema ya que no se me ocurre una manera de comparar 2 tablas las cuales son para un sistema de control de horarios, no se si podrias darme algunas ideas para desarrollar el query para este sistema, se te agradece de antemano la atencion.
ResponderEliminarhola Marcos
ResponderEliminarque tipo de comparacion necesitas realizar entre las tablas ?
la verdad no sabria que sugerir porque no tengo datos sobre lo que quieres lograr, ni la estructura de las tablas
saludos
Hola Leandro
ResponderEliminarSi disculpa, lo que intento es comparar 2 campos de 2 tablas diferentes, los campos son de tipo datetime y lo que deseo es que valide una tabla a partir de otra, por ejemplo el personal, si tiene asistencia, falta o retardo, esto es en lo que he pensado
select * from tabla1 inner join tabla2 on (tabla1.llave=tabla2.llave) where tabla2.campo = 'alo'
es un sistema de control de asistencias.
Se te agradece de antemano la atencion, gracias.
hola Marcos
ResponderEliminareso esa query esta correcta, lo que haces es unir por un campo ambas tablas para luego poder filtrarlas
si eso te funciona, entonces esta correcto
en esa query puede filtrar por fecha si lo necesitas
saludos
hola Leandro
ResponderEliminarGracias por tu tiempo, estare trabajando en ello.
Gracias
Hola Leandro, estoy iniciando en asp.net y tus blog ha sido de gran ayuda para mí, qeria saber cómo hago para activar un boton automáticamente cuando se llegue a la ultima pagina de un gridview?
ResponderEliminarEspero tu ayuda. Saludos cordiales y de antemano muchas gracias.
hola Yeyner
ResponderEliminarActive un boton? no sera que se invocar algun funcionalidad
Cuando paginas puedes conocer que pagina se esta pulsando, en el evento PageIndexChanging
Puedes comparar el e.NewPageIndex con el GridView.PageCount Property
saludos
Hola Leandro, estoy apenas iniciando en asp.net hago un registro de reportes e introduzco datos a travez de un DetailsView y los datos se muestran en un GridView, ocupo los comandos 'insert' del DetailsView para agregar los registros en la BD... pero al momento de hacer clic en el boton 'insertar registro' no se actualiza la el GridView Automáticamente, hice un botón con DataBind(); que se llama 'Actualizar Tabla' pero me piden que esto no se haga en otro botón, sino que al momento de insertar registros se actualize automáticamente la tabla. Necesito tu ayuda para hacer esto, no se como ni código. Porfavor!
ResponderEliminarhola
EliminarComo estas asignando los datos al GridView? usas algun control como el SqlDataSource
Si es asi con el DataBind() deberias recuperar los datos y actualizarlos
Ahora si los datos los obtienes de una query que ejecutas con ado.net, en ese caso deberias volver a ejecutarla y asignar el DataSource del grid
saludos
Hola Leandro,
ResponderEliminarEstoy tratando de abrir el Proyecto con VWD 2010 express y pincha en la compilacion.
Alguna sugerencia? O como lo debo abrir??
Hola Leandro!
ResponderEliminarCuál crees que sea el detalle por el que no me da la opción para elegir ese evento en mi Gridview?
Quedo al pendiente de tu comentarios, Saludos!