建议更有效地过滤大型datagridview数据源

时间:2016-01-06 09:18:08

标签: c# .net winforms datagridview datatable

说明:我有一个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);}

    }

0 个答案:

没有答案