filtrar fechas desde datos con buscar boton c# .net winforms datagridview datatable

c# - fechas - Sugerencias para un filtrado más eficiente en grandes fuentes de datos de datagridview



filtrar datos en gridview c# (0)

Explicación: Tengo una vista de cuadrícula de datos cuya fuente de datos es igual a una tabla de datos grande, de alrededor de 220k filas. La tabla de datos tiene números en su mayoría (columnas numéricas) y una columna para objetos de fecha y hora. La forma en que lo hago filtrando ahora, es el filtrado fuente vinculante:

mBindingSource.Filter = Filter;

donde Filter es la cadena apropiada para buscar. Este método funcionó de maravilla e instantáneamente para pequeñas tablas de datos de 10-50 filas, por ejemplo, pero es dolorosamente lento para el caso de 220k filas. Me imagino que esto se debe a que este método debe pasar por todas las filas del origen de datos y luego hacer su trabajo.

¿Cómo puedo mejorar la eficiencia de este filtrado? Estoy abierto a cualquier sugerencia, y cualquiera que requiera usar algo diferente al filtro bindingSource.

Una segunda pregunta es: ¿Alguien sabe cómo Excel implementa su filtrado? Intenté filtrar en Excel para la tabla de datos del mismo tamaño y la búsqueda fue casi instantánea.

Editar: agregando el código que hace el filtrado ( http://www.codeproject.com/Articles/33786/DataGridView-Filter-Popup ). Básicamente, toma el origen de datos de tha datagridview y lo convierte en una vista de datos, también comprueba si hay una fuente de enlace. En la inicialización, crea una lista de filtros de columna dgvbasecolumn, que sirven como base para los filtros. Tihs significa que crea un filtro para cada columna de la vista de cuadrícula de datos, pero solo tengo unas pocas (30) columnas, por lo que no debería ser un problema. Al final, cuando el usuario presiona OK para aplicar los filtros, sucede esto:

public void RebuildFilter() { mFilterIsActive = false; string Filter = ""; foreach (DgvBaseColumnFilter CF in mColumnFilterList) { if (CF == null) continue; if (CF.Active && CF.FilterExpression != "") { Filter += " AND (" + CF.FilterExpression + ")"; CF.DataGridViewColumn.HeaderText = CF.FilterCaption; } else { CF.DataGridViewColumn.HeaderText = CF.OriginalDataGridViewColumnHeaderText; } } if (Filter != "") { mFilterIsActive = true; Filter = (mBaseFilter == "") ? "1=1 " + Filter : mBaseFilter + " " + Filter; } else Filter = mBaseFilter; // Apply the filter only if any changes occurred try { if (mBindingSource != null) { if (mBindingSource.Filter != Filter) mBindingSource.Filter = Filter; } else { if (mBoundDataView.RowFilter != Filter)mBoundDataView.RowFilter = Filter; } } catch { Console.WriteLine ("Invalid filter: " + Filter);} }