首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# DataGridView 刪除特定時間值行的最佳實踐:數據源層面操作而非 UI 層

     編輯:程式設計綜合問答

錯誤姿勢:直接操作 DataGridView.Rows 集合


// 錯誤示範:正向刪除導致索引偏移、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 為數據源


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);
}

方案二:BindingList<T> 泛型列表


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 更新

方案三:LINQ 過濾生成新列表(推薦)


var filtered = originalList.Where(x => x.MinimunKnitTime != TimeSpan.Zero).ToList();
dgv.DataSource = new BindingList(filtered);

關鍵類型轉換:字符串 "0:00:00" → TimeSpan


// 數據庫讀取時直接轉型
TimeSpan ts = TimeSpan.Parse(reader["MinimunKnitTime"].ToString());
// 或在實體屬性做轉換
public TimeSpan MinimunKnitTime {
    get => TimeSpan.Parse(RawTimeString);
    set => RawTimeString = value.ToString();
}

性能對比(10 萬行測試)

方法耗時UI 閃爍推薦指數
DataGridView.Rows.RemoveAt 正向極慢/卡死嚴重❌
DataGridView.Rows.RemoveAt 反向慢明顯⚠️
DataTable 原地刪除中等輕微✅
LINQ 過濾重綁定最快無⭐⭐⭐
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved