快速设置DataGridView行高

4

我有一个虚拟的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个回答

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();
    }

对于15000行数据,仅需150毫秒就能完成操作,而不创建单独的数组则需要15秒,快了100倍!

1

尝试使用以下代码替换您的代码,看看是否有性能提升。通常情况下,使用虚拟网格可以更快地运行 -

DataGridView.RowPrePaint 添加处理程序:

dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);

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

问题在于滚动条的大小不会被正确调整。 - ChandlerPelhams
直到每一行的预绘制方法被调用之前,网格仍然认为所有行都是默认的行模板高度。只有当用户滚动浏览所有行时,正确的高度才会被设置,网格才能正确滚动。 - ChandlerPelhams
AutoSizeRowsMode 设置为什么? - Angshuman Agarwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接