隐藏多行时,C#Datagridview性能会受到影响

时间:2012-02-13 12:13:02

标签: c# performance datagridview

我在C#中创建了一个DataGradView,它允许我折叠和展开行。 看起来像这样:

enter image description here

在创业时我想要折叠所有多个客户的客户。就像图中所示的那个。如果customers is < 10.000的总数很有效 如果customer is > 10.000的总数需要几分钟的时间。

崩溃所有客户的代码:

   int number = 0;
        int oldnumber = 0;
        int parent = 0;

        foreach (CustomDataGridViewRow row in dataGridView1.Rows)
        {
            try
            {
                number = int.Parse(row.Cells[1].Value.ToString());

                if (number != oldnumber && int.Parse(dataGridView1.Rows[row.Index + 1].Cells[1].Value.ToString()) == number)
                {
                    row.Is_expander = true;
                    parent = row.Index;

                }
                if (number == oldnumber)
                {
                    row.hide(parent);
                }
                oldnumber = number;
            }
            catch { }
        }

必须折叠的foreach行我调用row.hide(parent),它将可见性设置为false并保存父索引。

foreach父行将绘制一个图标

你能猜出为什么隐藏所有这些行需要这么长时间吗? 也许在每个隐藏的行屏幕再次绘制之后? 也许我在循环中做了不必要的或重量级的东西? 我不知道

4 个答案:

答案 0 :(得分:3)

您可以将VirtualModeDataGridView一起使用,以便非常有效地更新网格。请参阅此文章:http://msdn.microsoft.com/en-us/library/ms171622.aspx

如果您正在渲染&gt; 10,000个虚拟模式是必须的!

答案 1 :(得分:2)

隐藏和显示数据网格视图上的行非常慢,原因只有微软知道,我想。但是,将行复制到数组,在数组中操作它们并将它们复制回网格非常快。这是一些代码:

DataGridViewRow[] theRows = new DataGridViewRow[Adgv.Rows.Count];
Adgv.Rows.CopyTo(theRows, 0);
Adgv.Rows.Clear();
for (int loop = 0; loop < theRows.Length; loop++) theRows[loop].Visible = false;
Adgv.Rows.AddRange(theRows);

对于35000行,这在不到一秒的时间内完成。在我的代码中,我通常有一个表达式,用于定义是隐藏还是显示该行,并且表达式是在不到一秒的时间内执行的。 如果我试图在没有复制的情况下进行该操作,则需要几分钟时间。去图!

答案 2 :(得分:1)

是否有必要从头开始选择所有10000行。可以从1-9,10-19,20-19等开始在不同页面中显示数据。它将提高性能并提供分页系统。为什么不能尝试修改查询?

答案 3 :(得分:1)

如果设置了自动调整大小,则网格有问题。在visible-属性的每次更改中,都会检查整个网格的perfekt大小。

尝试以下方法:

Grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

foreach (DataGridViewRow Row in Grid.Rows) 
{
   if (......) 
   {
     Row.Visible = false;
   }
}
Grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;