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