当DataGridView删除行时仅删除备用行(Alternate Rows)的情况,通常与数据绑定和行选择机制有关。以下是可能的原因:
// 正确删除选中行的示例代码
private void DeleteSelectedRows()
{
// 检查是否有选中行
if (dataGridView1.SelectedRows.Count > 0)
{
// 从数据源删除
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
if (!row.IsNewRow) // 避免删除新行
{
dataGridView1.Rows.Remove(row);
}
}
}
}
如果使用数据绑定:
// 对于绑定数据源的情况
private void DeleteSelectedRowsFromDataSource()
{
if (dataGridView1.SelectedRows.Count > 0)
{
// 获取底层数据源
DataTable dt = (DataTable)dataGridView1.DataSource;
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
if (!row.IsNewRow)
{
dt.Rows.RemoveAt(row.Index);
}
}
// 重新绑定以刷新显示
dataGridView1.DataSource = dt;
}
}
如果设置了AlternatingRowsDefaultCellStyle,确保它不会影响行选择:
// 检查是否有这样的设置
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;
private void btnDelete_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count == 0)
{
MessageBox.Show("请先选择要删除的行");
return;
}
try
{
// 从后往前删除以避免索引变化问题
for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--)
{
DataGridViewRow row = dataGridView1.SelectedRows[i];
if (!row.IsNewRow)
{
if (dataGridView1.DataSource != null)
{
// 绑定数据源情况
DataTable dt = (DataTable)dataGridView1.DataSource;
dt.Rows.RemoveAt(row.Index);
}
else
{
// 非绑定数据源情况
dataGridView1.Rows.Remove(row);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("删除失败: " + ex.Message);
}
}
IsNewRow
属性,避免删除新行通过以上方法,应该可以解决DataGridView删除行时仅删除备用行的问题。