C# WinForm使用存储过程无法删除DataGridView数据:Id传递失败
解决DataGridView触发删除时Id参数传递失败的问题
你的删除功能失效的核心问题是点击删除按钮时,没有从选中的DataGridView行中获取目标记录的Id并赋值给aRegistrationProperty,导致存储过程接收到无效的Id参数;另外还有一个数据库连接未正确打开的潜在问题,我帮你一步步修复:
1. 修复删除按钮事件:获取选中行的Id
首先要在删除操作前,确认用户选中了要删除的行,然后从选中行提取Id并赋值给实体类。根据你的DataGridView绑定方式,有两种实现方案:
方案1:如果绑定的是DataTable
private void deleteButton_Click(object sender, EventArgs e) { // 先判断是否有选中行 if (dataGridView1.SelectedRows.Count == 0) { MessageBox.Show("请先选择要删除的记录!"); return; } // 从选中行的Id列取值(假设DataGridView中有名为"Id"的列) int targetId = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value); // 给实体类赋值Id aRegistrationProperty.Id = targetId; // 执行删除 int rows = aRegistrationBLL.Delete(aRegistrationProperty); if (rows > 0) { MessageBox.Show("Registration Delete successfully."); // 删除后刷新DataGridView,加载最新数据 LoadRegistrationData(); // 需自行实现该方法,重新查询数据库并绑定到DataGridView } else { MessageBox.Show("Registration Delete failed."); } }
方案2:如果绑定的是List<RegistrationProperty>
如果直接绑定实体集合,可以直接从绑定项中获取Id:
private void deleteButton_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count == 0) { MessageBox.Show("请先选择要删除的记录!"); return; } // 获取选中行对应的实体对象 RegistrationProperty selectedItem = (RegistrationProperty)dataGridView1.SelectedRows[0].DataBoundItem; aRegistrationProperty.Id = selectedItem.Id; int rows = aRegistrationBLL.Delete(aRegistrationProperty); if (rows > 0) { MessageBox.Show("Registration Delete successfully."); LoadRegistrationData(); } else { MessageBox.Show("Registration Delete failed."); } }
2. 修复数据访问层的连接问题
你的DLL层ExeNonQuery方法未打开数据库连接,ExecuteNonQuery必须在连接打开的状态下才能执行,同时要确保连接最终关闭:
public int ExeNonQuery(SqlCommand cmd) { cmd.Connection = GetConn(); int rowsAffected = -1; try { cmd.Connection.Open(); // 必须打开连接 rowsAffected = cmd.ExecuteNonQuery(); } finally { // 确保连接关闭,避免资源泄漏 if (cmd.Connection.State == ConnectionState.Open) { cmd.Connection.Close(); } } return rowsAffected; }
3. 额外检查项
- 确认存储过程
DeleteUser中的表名RegistrationTable、字段Id与数据库实际情况完全一致; - 确保
aRegistrationProperty是已实例化的对象(不是null),避免空引用异常; - 删除成功后一定要刷新DataGridView,否则界面不会同步更新已删除的记录。
内容的提问来源于stack exchange,提问作者Ken Kaneki




