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

C# DataGridView 判斷 IsNewRow 失效:遍歷變量引用錯誤導致邏輯錯誤

     編輯:程式設計綜合問答

問題代碼


private void button1_Click(object sender, EventArgs e) {
    DataGridViewRow rom = new DataGridViewRow(); // 錯誤:創建了新行對象,非 Grid 中的行
    for (int i = 0; i < dataGridView1.Rows.Count; i++) {
        if (rom.IsNewRow) { // 永遠判斷 rom (新行),而非 dataGridView1.Rows[i]
            dataGridView1.Rows[i].HeaderCell.Value = "是的";
        } else {
            dataGridView1.Rows[i].HeaderCell.Value = "不是";
        }
    }
}

錯誤分析

  • `DataGridViewRow rom = new DataGridViewRow();` 創建了一個**脫離 Grid 的新行對象**,其 `IsNewRow` 默認為 `false`。
  • 循環中始終判斷 `rom.IsNewRow`,**完全忽略了 `dataGridView1.Rows[i]`**。
  • 結果:所有行顯示「不是」,新行也顯示「不是」。

正確代碼


private void button1_Click(object sender, EventArgs e) {
    for (int i = 0; i < dataGridView1.Rows.Count; i++) {
        // 直接訪問 Grid 中的第 i 行
        if (dataGridView1.Rows[i].IsNewRow) {
            dataGridView1.Rows[i].HeaderCell.Value = "是的";
        } else {
            dataGridView1.Rows[i].HeaderCell.Value = "不是";
        }
    }
}

進階:更優雅的寫法 (foreach)


foreach (DataGridViewRow row in dataGridView1.Rows) {
    row.HeaderCell.Value = row.IsNewRow ? "是的" : "不是";
}

關鍵屬性說明

  • DataGridViewRow.IsNewRow:只讀屬性,指示該行是否為**允許用戶添加新行時顯示的佔位行** (`AllowUserToAddRows=true` 時最後一行)。
  • DataGridView.AllowUserToAddRows:設置為 `true` 時,Grid 底部自動顯示一行 `IsNewRow=true` 的新行佔位符。

避坑提示

  • 遍歷集合時,**直接使用集合元素**,不要創建同類型新對象作為判斷依據。
  • `DataGridViewRow` 構造函數創建的是**模板行**,非 Grid 內部行集合成員。
  • 調試時懸停查看 `dataGridView1.Rows[i]` 與 `rom` 的 `IsNewRow` 值差異即可定位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved