我有一个虚拟的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
?
答案 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);
}