说明:我有一个datagridview,其数据源等于一个大约220k行的大数据表。数据表主要有数字(数字列)和一列datetime对象。我现在过滤的方式是绑定源过滤:
mBindingSource.Filter = Filter;
其中Filter是要搜索的相应字符串。例如,对于10-50行的小型数据表,这种方法效果很好,但对于220k行的情况来说,这种方法很慢。我想这是因为这个方法必须遍历数据源的所有行,然后才能完成它的工作。
如何提高此过滤效率?我愿意接受任何好的建议,以及任何可能需要使用与bindingSource过滤器不同的东西。
第二个问题是:有谁知道Excel如何实现其过滤?我尝试在Excel上过滤相同大小的数据表,搜索几乎是即时的。
编辑:添加执行过滤的代码(http://www.codeproject.com/Articles/33786/DataGridView-Filter-Popup)。它基本上需要使用datagridview的数据源并将其转换为数据视图,它还会检查是否存在绑定源。在初始化时,它会创建一个dgvbasecolumnfilters列表,作为过滤器的基础。 Tihs意味着它为datagridview的每一列创建了一个过滤器,但我只有几(30)列,所以不应该成为问题。最后,当用户按下OK以应用过滤器时,会发生以下情况:
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);}
}