martes, 15 de enero de 2013

[GridView] - Ocultar dinámicamente botones, imágenes y link de la fila

 

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

image

 

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#]
 

10 comentarios:

  1. 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.

    ResponderEliminar
  2. hola Marcos

    que 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

    ResponderEliminar
  3. Hola Leandro

    Si 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.

    ResponderEliminar
  4. hola Marcos

    eso 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

    ResponderEliminar
  5. hola Leandro

    Gracias por tu tiempo, estare trabajando en ello.

    Gracias

    ResponderEliminar
  6. 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?

    Espero tu ayuda. Saludos cordiales y de antemano muchas gracias.

    ResponderEliminar
  7. hola Yeyner

    Active 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

    ResponderEliminar
  8. 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!

    ResponderEliminar
    Respuestas
    1. hola
      Como 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

      Eliminar
  9. Hola Leandro,

    Estoy tratando de abrir el Proyecto con VWD 2010 express y pincha en la compilacion.

    Alguna sugerencia? O como lo debo abrir??

    ResponderEliminar