You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过DataGridView每行的删除按钮永久删除数据库行

如何通过DataGridView中的删除按钮永久删除数据库对应行?

要实现点击DataGridView里的删除按钮永久删除数据库中的对应行,结合你已有的代码,我给你详细的实现方案:

第一步:处理DataGridView的CellClick事件

点击删除按钮时会触发DataGridView的CellClick事件,我们需要在这个事件里编写删除逻辑。你可以在窗体初始化时(比如Form_Load方法)绑定这个事件,或者直接在设计器里双击DataGridView的CellClick事件生成方法。

先把你原有的加载数据代码和事件绑定放在一起:

private void Form1_Load(object sender, EventArgs e)
{
    // 你原有的数据加载代码
    OleDbDataAdapter adp = new OleDbDataAdapter("select appsid,appsname from apps", con);
    DataTable dt = new DataTable();
    adp.Fill(dt);
    dataGridView1.DataSource = dt;

    // 绑定CellClick事件,用于处理删除按钮点击
    dataGridView1.CellClick += DataGridView1_CellClick;
}

第二步:编写删除逻辑的事件处理方法

在这个方法里,我们需要判断点击的是不是删除按钮列,然后获取对应行的主键(appsid),执行数据库删除操作,最后刷新DataGridView的数据:

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // 校验:确保点击的是删除按钮列,且是有效数据行(不是表头和新增空白行)
    if (e.ColumnIndex == dataGridView1.Columns["Deletefromgrid"].Index 
        && e.RowIndex >= 0 
        && !dataGridView1.Rows[e.RowIndex].IsNewRow)
    {
        // 获取当前行的appsid(数据库表的主键,用来精准定位要删除的记录)
        int appId = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["appsid"].Value);

        // 执行数据库删除操作,使用参数化查询避免SQL注入
        string deleteSql = "DELETE FROM apps WHERE appsid = ?";
        using (OleDbCommand cmd = new OleDbCommand(deleteSql, con))
        {
            cmd.Parameters.AddWithValue("@appsId", appId);
            
            // 确保数据库连接处于打开状态
            if (con.State != ConnectionState.Open)
            {
                con.Open();
            }
            
            // 执行删除并判断是否成功
            int affectedRows = cmd.ExecuteNonQuery();
            if (affectedRows > 0)
            {
                // 刷新DataGridView数据,两种方式可选:
                // 方式1:重新加载整个数据源(适合数据量小的场景)
                OleDbDataAdapter refreshAdp = new OleDbDataAdapter("select appsid,appsname from apps", con);
                DataTable refreshDt = new DataTable();
                refreshAdp.Fill(refreshDt);
                dataGridView1.DataSource = refreshDt;

                // 方式2:直接从绑定的DataTable中删除行(更高效)
                // DataTable boundDt = (DataTable)dataGridView1.DataSource;
                // boundDt.Rows[e.RowIndex].Delete();
                // boundDt.AcceptChanges();
            }
            
            // 关闭数据库连接
            con.Close();
        }
    }
}

关键注意事项

  • 主键定位:用appsid作为删除条件是因为它是表的唯一标识,能精准定位要删除的记录,避免误删其他数据。
  • 参数化查询:绝对不要用字符串拼接SQL的方式,参数化查询既能防止SQL注入攻击,也能避免数据格式(比如特殊字符)带来的错误。
  • 连接管理:使用using语句管理OleDbCommand,确保资源能被正确释放;同时要注意数据库连接的开闭状态,避免连接泄漏。
  • 数据刷新:如果你的数据量不大,重新加载整个数据源更简单;如果数据量较大,直接操作绑定的DataTable会更高效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:42