4

我有一个虚拟数据网格视图,我想为其设置不同的行高。我希望找到一种方法来一次设置所有行高,而不是一次遍历每个行高。

这是我尝试设置高度的方法,但性能非常糟糕,每 1,000 行大约 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在调整行大小时被调用?

4

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

对于 15,000 行,这只需 150 毫秒,而无需创建单独的数组则需要 15 秒,快 100 倍!

于 2012-06-15T16:47:14.783 回答
1

试试这个而不是你的代码,看看你是否有任何性能提升。通常使用虚拟网格,这可以更快地工作 -

添加处理程序DataGridView.RowPrePaint

dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    dataGridView1.AutoResizeRow(e.RowIndex);
}
于 2012-06-15T16:29:59.773 回答