2012-06-15 76 views
4

我有一个虚拟的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调整大小行时被调用?

回答

3

,性能,功能,阻碍不适用。

诀窍是创建行的阵列,大小它们,然后添加的行的范围到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:很显然,如果你独立的datagridview的创建行

dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint); 

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

问题在于滚动条的大小不正确。 – ChandlerPelhams

+0

我不这么认为。我已经在我的项目中尝试过。 –

+0

直到在每一行上调用行预涂方法,网格仍然会认为这些行都是默认的行模板高度。只有用户滚动浏览所有行时,才会设置正确的高度,并正确滚动网格。 – ChandlerPelhams