我有一个非数据绑定DGV(没有数据源等;手动添加行).为了过滤它,我一直在循环中检查并适当地设置行可见属性.这适用于较小的测试装置,但在较大的测试装置中完全失效. 1k行以5000 /秒过滤. 10k行仅以~250 /秒的速度过滤. 50k,仅为40 /秒.我对正在发生的事情的假设是,每次我更改行可见性时,DGV都会重建显示的行列表,将过滤过程转换为O(n ^ 2)操作.
甚至10k行表示用户滥用系统;表现不好的用户需要考虑,所以我需要做一些不同的事情.在没有使用数据绑定的情况下,是否有更快的方法来过滤大量的行,或者我是否需要回退清除/重新创建所有行(对于合理数量的数据,这显然更慢)?
//psuedocode. runs slowly if more than a few thousand rows. foreach (DataGridViewRow row in myDGV) { row.Visible = CalculateFilter(row); }
解决方法
我几年前遇到过这个问题(在我了解数据绑定之前)并在微软发现了一个错误信息,说这已经得到证实,但这个问题可能无法解决.
但是,有一些可能解决这个问题.
>将行添加到datagridview,将行添加到数据表并将其绑定到datagridview.
DataTable table = new DataTable(); table.Columns.Add("Name",typeof(String)); table.Columns.Add("...",typeof(String)); foreach (var element in list) table.Rows.Add(element.Name,element.Something); dataGridView1.DataSource = table1; table.DefaultView.RowFilter = "Name Like '...'";
>创建一个继承自BindingList并实现IBindingList的类.然后将其绑定到DataGridView.
>将DataGridView VirtualMode设置为true.