Rows.Add() 每次呼叫都會觸發內部佈局計算、事件引發、畫面重繪。1000 列 × 16 欄 = 16,000 次 Cell 賦值,每次都強制 UI 更新,導致 CPU 飆高、耗時 30 秒。
dataGridView1.SuspendLayout(); // 或 dataGridView1.Visible = false;
// 方案 A:資料來源綁定(最快)
var dt = new DataTable();
// ... 填充 dt ...
dataGridView1.DataSource = dt;
// 方案 B:若必須逐行,關閉自動調整並批次提交
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
foreach (var item in list) {
int rowIdx = dataGridView1.Rows.Add();
var row = dataGridView1.Rows[rowIdx];
row.Cells["col1"].Value = item.Prop1;
// ...
}
dataGridView1.ResumeLayout(); // 或 dataGridView1.Visible = true;
dataGridView1.Refresh();
實作 IVirtualMode(CellValueNeeded 事件),DataGridView 僅請求可視區域資料,**萬筆資料也能秒開**,記憶體佔用極低。
AutoSizeColumnsMode/RowsMode(已做)。RowTemplate、DefaultCellStyle 減少逐格設定。BeginUpdate/EndUpdate 封裝(DataGridView 無此方法,靠 SuspendLayout)。Rows.Count、Columns 等觸發索引器屬性。