martes, 2 de junio de 2015

C# Filtrando un DataGrid

En esta entrada explicaré como filtrar un GridView en C#.

Hay varias formas de filtrar el contenido de un GridView

1.- Modificando la consulta del DataSource y volver a llenar o enlazar el Grid o Rejilla
    El problema de este método es que se genera carga innecesaria al servidor, trafico en la red y posiblemente el usuario experimente cierta lentitud.

2.- Aplicando un filtro al DataSource (Tratandolo como una Tabla)
   En este caso solo se filtran los datos de manera local , no se realiza una nueva consulta a la base de datos.

Para poder realizar este tipo de filtrado lo único que debemos hacer es tratar al DataSet como una Tabla (cast) y una aplicar RowFilter de la propiedad DefaultView

Ejemplo Básico:

  (grdVieComprobantesListado.DataSource as DataTable).DefaultView.RowFilter = 'SERIE = AB"



Ejemplo Complejo

Para este ejemplo partiremos de un formulario que uso para visualizar las facturas emitidas, El formulario tiene en la primer parte todos los filtros, posibles y en la segunda todas las facturas emitidas que cumplan con los filtros.




Lo mas laborioso es crear el procedimiento que nos devolverá la cadena con  el filtro que vamos a aplicar, en este caso podemos filtrar por Serie por Folio POR UUID, por fechas etc.


 /// <summary>
 /// Analiza los valores de los TextBox usados para el filtro 
 /// y devuelve una cadena con el filtro Resultante (Sólo toma        encuenta los cuadros de texto que tiene un valor en la propiedad Text)
/// La operación lógica de concatenación es AND 
/// La operación lógica de comparacion es = (Igual) excepto para los caos del Nombre del Receptor y el UUID en cuyo caso se usa el operador LIKE  
/// </summary>
private string CrearFiltro()
{
    string filtro = "1=1 ";
    
    if (!string.IsNullOrEmpty(txtSerie.Text))
        filtro += " AND Serie = " + "'" + txtSerie.Text +"'" ;

    if(!String.IsNullOrEmpty(txtFolio.Text))
        filtro += "AND Folio = " + txtFolio.Text;

    if (!String.IsNullOrEmpty(txtReferencia.Text))
        filtro += "AND Referencia = " +(""+txtReferencia.Text+""+);

    if (!String.IsNullOrEmpty(txtRfcReceptor.Text))
         filtro += " AND RfcReceptor = " +(""+txtRfcReceptor.Text+"");

    if (!String.IsNullOrEmpty(txtNomReceptor.Text))
         filtro += " AND Receptor like " +( ("'%" + txtNomReceptor.Text + "%'"));
           
    if (!String.IsNullOrEmpty(txtUUID.Text))
         filtro += " AND UUID like " + "'%" + txtUUID.Text + "%'"));

    if (chkFilFechas.Checked)
    {
         filtro += "AND FechaEmision >= " + "" +( dtpFecEmiInicial.Value.Date.ToString() + "");
                filtro += "AND FechaEmision <= " + ""+ dtpFecEmiFinal.Value.Date.AddHours(23.999).ToString() +""+);
            }


    return filtro;

        }

/// <summary>
        /// Aplica los filtros al grid
        /// </summary>
        private void FiltrarGrid()
        {
            (grdVieComprobantesListado.DataSource as DataTable).DefaultView.RowFilter = CrearFiltro(); 

        }


Finalmente en cada uno de los controles en el evento Lave o Change podemos invocar al método CrearFiltro