Dan*_*ely 6 c# datagridview filter
我有一个非数据绑定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 '...'";
Run Code Online (Sandbox Code Playgroud)创建一个继承自BindingList并实现IBindingList的类.然后将其绑定到DataGridView.
将DataGridView VirtualMode设置为true.
方法二更复杂,因为您必须添加自己的逻辑来实现FindCore方法.
如果在过滤时临时从dataGridView中删除行,则整体性能应该会大大提高.
复制并粘贴此代码(不要忘记为按钮事件添加事件处理程序)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Stopwatch watch = new Stopwatch();
private void Form1_Load(object sender, EventArgs e)
{
// populate dataGridView
for (int i = 0; i < 10000; i++)
dataGridView1.Rows.Add("Column", i+1, 10000 - i);
for (int i = 0; i < 10000; i = i + 2)
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
// remove filter
private void button1_Click(object sender, EventArgs e)
{
watch.Reset();
watch.Start();
foreach (DataGridViewRow row in dataGridView1.Rows)
row.Visible = true;
watch.Stop();
MessageBox.Show(watch.ElapsedMilliseconds.ToString());
}
// add filter (hide all odd rows)
private void button2_Click(object sender, EventArgs e)
{
watch.Reset();
watch.Start();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToInt32(row.Cells[1].Value) % 2 != 0)
row.Visible = false;
}
watch.Stop();
MessageBox.Show(watch.ElapsedMilliseconds.ToString());
}
// remove filter (improved)
private void button3_Click(object sender, EventArgs e)
{
watch.Reset();
watch.Start();
List<DataGridViewRow> rows = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
rows.Add(row);
}
dataGridView1.Rows.Clear();
foreach (DataGridViewRow row in rows)
row.Visible = true;
dataGridView1.Rows.AddRange(rows.ToArray());
watch.Stop();
MessageBox.Show(watch.ElapsedMilliseconds.ToString());
}
// add filer (improved)
private void button4_Click(object sender, EventArgs e)
{
watch.Reset();
watch.Start();
List<DataGridViewRow> rows = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
rows.Add(row);
}
dataGridView1.Rows.Clear();
foreach (DataGridViewRow row in rows)
{
if (Convert.ToInt32(row.Cells[1].Value) % 2 != 0)
{
row.Visible = false;
}
}
dataGridView1.Rows.AddRange(rows.ToArray());
watch.Stop();
MessageBox.Show(watch.ElapsedMilliseconds.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
12543 次 |
| 最近记录: |