2011-04-23 7 views
3
string s = Clipboard.GetText().Replace("\r", " "); 
string[] lines = s.Split('\n'); 
int row = dgView.CurrentCell.RowIndex; 
int col = dgView.CurrentCell.ColumnIndex; 
int linesCount = lines.Count(); 
if ((row + linesCount) - dgView.RowCount > 0) dgView.Rows.Add((row + linesCount) - dgView.RowCount); 

asyncSqlResultsViewer.publicToolStripProgressBar.Maximum = linesCount; 
asyncSqlResultsViewer.publicToolStripProgressBar.Step = 1; 
asyncSqlResultsViewer.publicToolStripProgressBar.Visible = true; 
dgView.ReadOnly = true; 

foreach (string line in lines) 
{ 
    if (line.Length > 0) 
    { 
     string[] cells = line.Split('\t'); 
     for (int i = 0; i < cells.GetLength(0); ++i) 
     { 
      if (col + i < dgView.ColumnCount) 
      { 
       dgView[col + i, row].Value = cells[i]; 
      } 
      else 
      { 
       break; 
      } 
     } 
     row++; 
    } 
    else 
    { 
     break; 
    } 
    asyncSqlResultsViewer.publicToolStripProgressBar.PerformStep(); 
} 

非常に遅いです。 5列の500行を貼り付けるには約30秒かかります。 DataGridViewに既にデータがある可能性があることを考慮してください。必ずしも上書きする必要はありません(すべて開始セルに依存します)。だから私はDataTableを使用してそれをDataSourceとして割り当てることができるかどうか分からない。このコードはなぜDataGridViewに貼り付けるのが遅いのですか?

答えて

1

を私はAllCellsに私のAutoSizeColumnsModeセットを持っていました。ペーストするときはNoneに設定する必要があります。それは指数関数的な違いになります。私の30秒は半分以下になりました。

2

あなたは常にグリッドを更新する前に、レイアウトを一時停止する必要があります

dgView.SuspendLayout(); 
// Do updates here 
dgView.ResumeLayout(); 
+0

私はそれをしましたが、それはあまり役に立たなかった。 – Juan

関連する問題