// 錯誤示範:正向刪除導致索引偏移、UI 卡頓、數據不同步
for (int i = 0; i < dgv.Rows.Count; i++) {
if (dgv.Rows[i].Cells["TimeCol"].Value.ToString() == "0:00:00") {
dgv.Rows.RemoveAt(i); // i 不遞減會跳過下一行
}
}
DataGridView 只是視圖,真實數據在 DataTable/BindingList<T>/List<T> 中。
DataTable dt = (DataTable)dgv.DataSource;
// 篩選保留行
var rowsToKeep = dt.AsEnumerable()
.Where(r => r.Field("MinimunKnitTime") != TimeSpan.Zero)
.CopyToDataTable();
// 重新綁定
dgv.DataSource = rowsToKeep;
// 或原地刪除(反向循環)
for (int i = dt.Rows.Count - 1; i >= 0; i--) {
if (dt.Rows[i].Field("MinimunKnitTime") == TimeSpan.Zero)
dt.Rows.RemoveAt(i);
}
var list = (BindingList)dgv.DataSource;
// 反向移除
for (int i = list.Count - 1; i >= 0; i--) {
if (list[i].MinimunKnitTime == TimeSpan.Zero)
list.RemoveAt(i);
}
// BindingList 自動通知 UI 更新
var filtered = originalList.Where(x => x.MinimunKnitTime != TimeSpan.Zero).ToList();
dgv.DataSource = new BindingList(filtered);
// 數據庫讀取時直接轉型
TimeSpan ts = TimeSpan.Parse(reader["MinimunKnitTime"].ToString());
// 或在實體屬性做轉換
public TimeSpan MinimunKnitTime {
get => TimeSpan.Parse(RawTimeString);
set => RawTimeString = value.ToString();
}
| 方法 | 耗時 | UI 閃爍 | 推薦指數 |
|---|---|---|---|
| DataGridView.Rows.RemoveAt 正向 | 極慢/卡死 | 嚴重 | ❌ |
| DataGridView.Rows.RemoveAt 反向 | 慢 | 明顯 | ⚠️ |
| DataTable 原地刪除 | 中等 | 輕微 | ✅ |
| LINQ 過濾重綁定 | 最快 | 無 | ⭐⭐⭐ |