在DataGridView中对数据进行多行删除,并更新到sql数据库

上一篇博文详细介绍了在DataGridView中对数据进行删除,以真删除和假删除为例进行了演示,具体请参考:
https://blog.csdn.net/qq_39217004/article/details/105366769

在DataGridView中对数据进行多行删除,并更新到sql数据库

下面演示在控件上实现对数据的多行删除:(以假删除位列说明,真删除只需要更改sql语句即可)
演示的结果在后文中,先看实现的过程:
//鼠标选择要删除的数据
//获取要删除数据的StuId
//判断选择的个数,若选择个数大于0,则删除,否则提示未选择
//删除操作 在代码里启动事务

1.鼠标选择要删除的数据,获取要删除数据的StuId

 List<int> listIds = new List<int>();//定义一个泛型 存储要删除的Id号
 for (int i = 0; i < dgvStudents.Rows.Count; i++)//遍历表中的所有行数,获取选中的行数据
 {
     DataGridViewCheckBoxCell cell = dgvStudents.Rows[i].Cells["colCheck"] as DataGridViewCheckBoxCell;//获取复选框
     //若cell.Value值为 null,即没选中任何行,则chk为false,否则只要选中了某一行,则返回true
     bool chk = Convert.ToBoolean(cell.Value);//若选中的数量不为0
     if (chk)
     {
         //获取行数据并把数据存储在listIds泛型中
         DataRow dr = (dgvStudents.Rows[i].DataBoundItem as DataRowView).Row;
         int stuId = (int)dr["StuId"];
         listIds.Add(stuId);
     }
 }

2.判断选择的个数,若选择个数大于0,则删除,否则提示未选择
利用SqlTransaction类启动事务,以下是固定用法,具体参考链接
/https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqltransaction?view=netframework-4.8

  using (SqlConnection conn =new SqlConnection(SqlHelper.connString))
 {
     //事务启动是通过conn来开启
     conn.Open();
     SqlTransaction trans = conn.BeginTransaction();//开启一个事务
     SqlCommand cmd = new SqlCommand(); //利用SqlCommand执行事务
     //固定用法
     //为挂起的本地事务将事务对象和连接都分配给命令对象
     cmd.Connection = conn;
     cmd.Transaction = trans;
  }

首先,遍历泛型类,将参数传递至SqlParameter ,然后提交事务并返回受影响的行数;
注意catch中的异常捕捉有以下语句,这是微软提供的用法
trans.Rollback();//catch特定用法,从挂起状态滚回事务
注意:
每次循环传参时都要清空一次;

 try
 {                          
     foreach (int id in listIds)
     {
         //cmd.CommandText = "delete from StudentInfo where StuId=@StuId";//真删除
         cmd.CommandText = "update StudentInfo set IsDeleted=1 where StuId=@stuId";//假删除
         SqlParameter para = new SqlParameter("@StuId",id);
         cmd.Parameters.Clear();
         cmd.Parameters.Add(para);
         count += cmd.ExecuteNonQuery();
     }
     trans.Commit();//提交事务,代表所有的事务已经提交到数据库
     Console.WriteLine("Both records are written to database.");
 }
 catch (SqlException ex)
 {
     trans.Rollback();//catch特定用法,从挂起状态滚回事务
     MessageBox.Show(ex.Message, "删除学生信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
     return;
 }

若上边返回的受影响的行数和泛型类中的值(你手动选中的行数)相同,则提示删除成功;并在datagridview中把选中的信息删除掉

if (count == listIds.Count)
{
    MessageBox.Show("选中的学生信息删除成功", "删除学生信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    //列表的手动刷新
    DataTable dtStudents = (DataTable)dgvStudents.DataSource;//获取数据源
    string idStr = string.Join(",",listIds);
    DataRow[] rows = dtStudents.Select("StuId in (" + idStr + ")");
    foreach (DataRow dr in rows)
    {
        dtStudents.Rows.Remove(dr);
    }
    dgvStudents.DataSource = dtStudents;
}

注意,移出选中信息的方法:

//是把选中的信息用,做字符串分隔,
string idStr = string.Join(",",listIds);
//要用来筛选行的条件    具体请参考ataView RowFilter 语法
DataRow[] rows = dtStudents.Select("StuId in (" + idStr + ")");

比如选中1002 1004 1005(StuId) 三行信息
则执行完这句话之后,

idStr =1002,1004,1005//筛选条件
"StuId in "1002,1004,1005""

在这里插入图片描述
至此,代码过程已经展示完毕

以下是实现的结果演示 :

1.最初数据库中的信息
在这里插入图片描述
2.上位机界面加载信息
在checkbox选中要删除的行数,点击“删除"按钮,再点击“确定”
在这里插入图片描述
3.界面上的三行选中数据消失了
在这里插入图片描述
4.检查数据库中的信息,点击“执行”,可以看到选中的三行数据标志位已经为1,代表假删除成功
在这里插入图片描述
5.再次启动程序的时候,删除是信息不回再显示在界面上
在这里插入图片描述

至此,多行删除信息 的功能已经全部实现;
欢迎各位的批评指正!!

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值