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

Mar*_*mer 2 c# performance datagridview

我用 C# 制作了一个 DataGradView,它允许我折叠和展开行。看起来像这样:

在此输入图像描述

在启动时,我想折叠具有多个条目的所有客户。就像图中所示的那样。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 { }
        }
Run Code Online (Sandbox Code Playgroud)

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

对于每个父行将绘制一个图标

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

Thu*_*rGr 5

我猜,在 datagridview 上隐藏和显示行非常慢,原因只有微软知道。然而,将行复制到数组、在数组中操作它们并将它们复制回网格的速度非常快。这是一些代码:

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);
Run Code Online (Sandbox Code Playgroud)

对于 35000 行,此操作只需不到一秒即可完成。在我的代码中,我通常有一个表达式来定义该行是隐藏还是显示,并且它与该表达式一起在不到一秒的时间内执行。如果我尝试在不复制的情况下执行该操作,则需要几分钟的时间。去搞清楚!