快速设置DataGridView行高

时间:2012-06-15 16:25:30

标签: c# winforms datagridview

我有一个虚拟的datagridview,我想设置不同的行高。我希望找到一种方法来同时设置所有行高,而不是一次循环遍历每一行。

这是我尝试设置高度的方法,但性能非常糟糕〜每1000行1秒。对我来说,平均行数约为20k-30k,所以这是不可接受的。

public void PopulateData()
    {
        this.SuspendLayout();

        this.RowCount = Data.RowCount;

        for (int i = 0; i < Data.RowCount; i++)
        {
            this.Rows[i].Height = Data.RowHeights[i];
        }

        this.ResumeLayout();
    }

我确保首先关闭自动调整大小,但性能仍然很差。

this.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
        this.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

有没有办法传递行高的数组或阻止在调整行时调用OnRowHeightChanged

2 个答案:

答案 0 :(得分:3)

显然,如果您独立于datagridview创建行,则性能阻碍功能不适用。

诀窍是创建一个行数组,调整它们的大小,然后将行范围添加到datagridview:

public void PopulateData()
    {
        this.SuspendLayout();

        DataGridViewRow[] rows = new DataGridViewRow[Data.RowCount];
        for (int i = 0; i < rows.Length; i++)
        {
            DataGridViewRow row = new DataGridViewRow();
            row.Height = Data.RowHeights[i];
            rows[i] = row;
        }
        this.Rows.AddRange(rows);

        this.ResumeLayout();
    }

对于15,000行,这只花了150毫秒,相比之下,15秒没有创建一个单独的阵列,快了100倍!

答案 1 :(得分:1)

试试这个代替你的代码&amp;看看你是否有任何性能提升。通常使用虚拟网格可以更快地运行 -

DataGridView.RowPrePaint添加处理程序:

dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    dataGridView1.AutoResizeRow(e.RowIndex);
}