在上位机winform端DataGridView控件中对数据进行删除,并更新到数据库
首先介绍一下两种删除方式,真删除和假删除,先介绍假删除,后边是真删除
真删除:
真删除指的是把数据库中的数据真正的删除掉了,不会重新显示,再需要该数据,应该重新添加,用的是delete语句
假删除:
并不是真正的把数据库中的数据删除了,只是在想删除的数据列设置一个标志位IsDeleted,假设该标志位默认情况下为0,想删除某一行数据的时候,将该标志位置1,用的是update语句
这样在数据库中还有该数据,但是上位机DataGridView中便不再显示,具体过程如下:
- 这是数据库中的数据信息,
在设计表的时候加一列int类型的IsDeleted,并设置默认情况下为0.
- 在上位机加载DataGridView控件中的信息的时候,用的sql语句如下:
注意加一句 where s.IsDeleted=0 这样就会显示默认IsDeleted=0时的是所有数据行
下图是在上位机的sql语句以及在SQL执行查询语句的检验,显示的查询结果
- 这是上位机界面的显示信息
如何显示 第一列和最后两列是在datagridview中添加Link列和Checkbox列,具体参考上一篇博文
https://blog.csdn.net/qq_39217004/article/details/105364814
下面介绍如何在代码中实现,假删除的步骤以及思路
- 设置控件datagridview的CellContentClick注册事件,点击单元格中内容,触发该事件
- 在CellContentClick事件中添加代码
- 首先获取当前点击的单元格的行列索引(第几行第几列,确定选中的数据)
- 若点击的是第n行最后一列删除键,则执行方法
- 先获取鼠标点击的行数据,利用datagridview转datarow
- 写sql语句在数据库中将所选定的行数据的标志位设置为1
- datagridview中刷新一下,把刚刚选中的datarow移除掉
选择一个要删除的对象,点击删除,再点击确定,提示删除成功,界面上的信息也随之消失
打开数据库观看结果,
点击执行,可以看到在界面上选定的行的isDeleted标志位已经变为1
再次启动程序页面,会发现,删除的“王凤”的信息已经不显示在页面上了
private void dgvStudents_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1) //鼠标点击的位置在 列标题位置下的数据,才触发
{
//1 获取我当前点击的单元格的行列数索引
//2 判断是否选择的是link列,并且判断是 删除还是修改
DataGridViewCell cell = dgvStudents.Rows[e.RowIndex].Cells[e.ColumnIndex];//1
if (cell is DataGridViewLinkCell && cell.FormattedValue.ToString() == "删除")
{
//删除操作
DialogResult drResult = MessageBox.Show("你确定要删除该学生的信息吗?", "删除学生信息提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (drResult == DialogResult.Yes)
{
//获取行数据
//dgvStudents.Rows[e.RowIndex]是数据表中鼠标点击的行索引 DataRow表示表中的一行数据
//(xxx).Row才获取到了所选中的行列索引所绑定的对象
//DataGridViewRow转换为DataRow
DataRow dr = (dgvStudents.Rows[e.RowIndex].DataBoundItem as DataRowView).Row;
int stuId = int.Parse(dr["stuId"].ToString());//将stuId字符串型转化为整型
//假删除 IsDeleted
string sqlDel0 = "update StudentInfo set IsDeleted=1 where StuId=@stuId";
SqlParameter para = new SqlParameter("@StuId", stuId);
int count = SqlHelper.ExecuteNonQuery(sqlDel0, para);
if (count > 0)
{
MessageBox.Show("该学生信息删除成功", "删除学生信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//DataGridView中的数据并没有刷新,需要手动刷新一下
DataTable dtStudents = (DataTable)dgvStudents.DataSource;//获取到数据源
dtStudents.Rows.Remove(dr);//将获取到的行列索引所绑定的对象移出
dgvStudents.DataSource = dtStudents;//重新指定数据源
}
else
{
MessageBox.Show("该学生信息删除失败", "删除学生信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
下面介绍真删除:
在假删除的基础上,只需要稍微改动一下sql语句
改动一:
string sqlDel0 = “delete StudentInfo where StuId=@stuId”;
改动二:
加载datagridview的时候,把sql语句改为
下面查看调试结果:
在控件中选中一个删除的数据,点击:删除,界面上信息消失。
在sql中发现学生表中的“王凤”的信息也被彻底删除了,达到预期效果了
至此,功能已经全部完成