You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WinForm中如何删除DataGridView选中行并同步更新数据库?

嘿,我来帮你把这段删除逻辑补全!刚好之前做过类似的WinForm功能,咱们一步步来完善:

核心思路

要实现「删除DataGridView选中行+同步删除数据库数据」,得遵循先删数据库,再更新界面的顺序(避免界面删了但数据库没删的不一致情况),还要加必要的校验和异常处理。

完善后的完整代码

首先,咱们先补全按钮点击事件的逻辑,再封装数据库删除的方法:

1. 按钮点击事件完整代码

private void btnDelete_Click(object sender, EventArgs e)
{
    // 第一步:校验是否选中行
    if (dgvKH.SelectedRows.Count == 0)
    {
        MessageBox.Show("请先选中要删除的记录!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }

    // 第二步:增加删除确认,防止误操作
    DialogResult confirmResult = MessageBox.Show("确定要删除这条记录吗?删除后无法恢复!", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
    if (confirmResult != DialogResult.Yes)
    {
        return;
    }

    try
    {
        // 第三步:获取选中行的主键(数据库删除需要唯一标识)
        // 这里假设你的DataGridView绑定的是DataTable,若绑定的是实体类集合,看下方注意事项
        DataRowView selectedRowView = (DataRowView)dgvKH.SelectedRows[0].DataBoundItem;
        int recordId = Convert.ToInt32(selectedRowView.Row["ID"]); // 替换成你的主键列名,比如CustomerID等

        // 第四步:调用数据库删除方法
        bool isDeleteSuccess = DeleteRecordFromDatabase(recordId);

        // 第五步:删除成功后更新界面
        if (isDeleteSuccess)
        {
            // 方式一:直接移除DataGridView中的选中行
            dgvKH.Rows.RemoveAt(dgvKH.SelectedRows[0].Index);
            // 方式二:如果你的Load()方法是重新从数据库加载所有数据,也可以调用Load();
            MessageBox.Show("删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作出错:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

2. 数据库删除方法封装

private bool DeleteRecordFromDatabase(int recordId)
{
    // 替换成你实际的数据库连接字符串
    string connectionString = "Server=你的服务器名;Database=你的数据库名;Uid=用户名;Pwd=密码;";
    // 替换成你的表名和主键条件
    string deleteSql = "DELETE FROM 你的表名 WHERE ID = @RecordId";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(deleteSql, conn))
        {
            // 用参数化查询防止SQL注入
            cmd.Parameters.AddWithValue("@RecordId", recordId);

            try
            {
                conn.Open();
                int affectedRows = cmd.ExecuteNonQuery();
                // 影响行数>0表示删除成功
                return affectedRows > 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"数据库删除失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }
    }
}
重要注意事项
  • 替换占位内容:把代码中的连接字符串表名主键列名改成你项目中的实际值
  • 实体类绑定适配:如果你的DataGridView绑定的是实体类集合(比如List<Customer>),获取主键的代码要改成:
    var selectedCustomer = (Customer)dgvKH.SelectedRows[0].DataBoundItem;
    int recordId = selectedCustomer.ID;
    
  • 参数化查询:一定要用参数化查询,避免SQL注入风险
  • 异常处理:数据库操作容易出现连接失败、权限不足等问题,异常处理能提升用户体验

内容的提问来源于stack exchange,提问作者Ben

火山引擎 最新活动