DataGridView 底部出現的「空白行」實際上是 **「新記錄輸入行」**,由屬性 AllowUserToAddRows = true (預設) 控制。這是為了方便用戶直接在表格末尾新增數據的設計,而非 Bug。
若不需要用戶在界面直接新增行:
// 設計器屬性窗口 或 代碼中
dataGridView1.AllowUserToAddRows = false;
「平時隱藏空白行,點擊『新增』按鈕時顯示,提交後隱藏」。
// 1. 窗體載入時初始化禁用
private void Form_Load(object sender, EventArgs e) {
dataGridView1.AllowUserToAddRows = false;
}
// 2. 「新增」按鈕點擊事件
private void btnAdd_Click(object sender, EventArgs e) {
dataGridView1.AllowUserToAddRows = true;
// 可選:自動滾動到新行並進入編輯狀態
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0];
dataGridView1.BeginEdit(true);
}
// 3. 利用 RowsAdded 事件:用戶輸入完畢離開新行時,自動關閉新增模式
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
// 只有當 AllowUserToAddRows 為 true 且新增的是「新記錄行」時處理
if (dataGridView1.AllowUserToAddRows && e.RowIndex == dataGridView1.Rows.Count - 1) {
// 這裡可以不立即關閉,等用戶點「保存」或驗證通過後關閉
// 若想輸入一行就關閉:
// dataGridView1.AllowUserToAddRows = false;
}
}
// 4. 「保存/提交」按鈕:驗證數據 -> 入庫 -> 關閉新增行
private void btnSave_Click(object sender, EventArgs e) {
if (ValidateInput()) {
SaveToDatabase();
dataGridView1.AllowUserToAddRows = false; // 關鍵:恢復禁用
RefreshGrid(); // 重新綁定數據源顯示最新數據
}
}
BindingList 或 DataTable,新增行會自動添加到數據源。禁用屬性僅影響 UI 顯示,不影響代碼 list.Add(new Item())。RowValidating 事件中驗證新行數據,失敗時 e.Cancel = true 可阻止用戶離開該行。AllowUserToAddRows=true,可通過 dataGridView1.Rows[dataGridView1.NewRowIndex].Visible = false 隱藏 (不推薦,易出錯),不如屬性切換乾淨。理解「新記錄行」本質,靈活切換 AllowUserToAddRows 配合 RowsAdded/RowValidating 事件,即可實現專業級的表格交互體驗。