問題代碼
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` 值差異即可定位。