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.
/// <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
No hay comentarios.:
Publicar un comentario