datagridview删除多行数据

时间:2022-05-15 14:47:48
C#中在一个窗体中有一个datagridview1控件 里面datagridview1.DataSource = operdb.strdt("SELECT 序号,员工编号,单位,姓名 from tb1);
tb1表中序号是唯一的,记录有上千条,我需要的是在datagridview1控件中选中多行,点删除后,就执行 "delete tb1 where 序号=" + datagridview1[0, datagridview1.CurrentCell.RowIndex].Value.ToString()" 在数据库中删除该条语句
然后再datagridview1.DataSource = operdb.strdt("SELECT 序号,员工编号,单位,姓名 from tb1);重新加载datagridview1数据, 现在问题是我如何使用循环在数据库中一条一条的删除我在datagridview1中选中的多行数据.

9 个解决方案

#1


DataGridViewCheckBox选择删除
foreach (DataGridViewRow dr in this.dataGridView1.Rows)
  {
  DataGridViewCheckBoxCell cbx = (DataGridViewCheckBoxCell)dr.Cells[0];
  if ((bool)cbx.FormattedValue)
  {
  }
}  

#2


delete 表名 where 字段 in (id,id,id,id,id)

这样也可以
   不过你要传你要删除行的id

#3


楼上的已经给出解决办法了,楼主试试。

#4


如果你是用DataGridViewCheckBox选择的话就用2楼的方法
如果dataGridView允许多行选择的话,就试下以下方法。

            SqlCommand cmd = new SqlCommand(string.Empty, sqlcon);
            SqlTransaction tran = cmd.Transaction;
            try
            {
                for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                {
                    cmd.CommandText = "delete tb1 where 序号=" + dataGridView1.SelectedRows[i].Cells[0].ToString();
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
                MessageBox.Show("删除成功!  ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch(Exception ex)
            {
                tran.Rollback();
                MessageBox.Show("删除失败!  " + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

#5


2楼正解
不过楼主为什么要每删除一条就要重新绑定数据源呢  
弄个进度条显示删除进度  操作完成后再绑定不好点?
频繁的开启和关闭数据库连接  如果要删除的数据太多  还不慢死

#6


循环遍历选中行数,再获取到当前行的dt1列数据,然后删除
/// <summary>
        /// 删除用户信息方法
        /// </summary>
        private void DeleteUserInfo()
        {
            if (MessageBox.Show("确认要删除选择的记录吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                int selectNum = this.dgvUserInfo.SelectedRows.Count;
                for (int i = 0; i < selectNum; i++)
                {
                    int uid = Convert.ToInt32(dgvUserInfo.SelectedRows[i].Cells[0].Value.ToString());
                    byte[] byteId = new byte[1];
                    byteId[0] = (byte)uid;
                    byte[] byteData = BllManager.GetSendByte(byteId, Convert.ToInt32(MainState.UserInfo), Convert.ToInt32(UserInfos.DeleteUserInfo), 0);
                    ClientConnService.AddSendQueueManager(byteData);
                }
            }
        }

#7


关键代码就是这里

int selectNum = this.dgvUserInfo.SelectedRows.Count;
//得到选中的行数
for (int i = 0; i < selectNum; i++)
{
   //得到第i行第一列的值,即id标识(应为我这里第一列是唯一标识)
   int uid = Convert.ToInt32(dgvUserInfo.SelectedRows[i].Cells[0].Value.ToString());
   //执行删除
}

#8


datagridview删除多行数据

#9


引用 2 楼  的回复:
delete 表名 where 字段 in (id,id,id,id,id)

这样也可以
   不过你要传你要删除行的id


你不能确定"delete 表名 where 字段 in (id,id,id,id,id)”这句的id的个数好吧!你自己再想想

#1


DataGridViewCheckBox选择删除
foreach (DataGridViewRow dr in this.dataGridView1.Rows)
  {
  DataGridViewCheckBoxCell cbx = (DataGridViewCheckBoxCell)dr.Cells[0];
  if ((bool)cbx.FormattedValue)
  {
  }
}  

#2


delete 表名 where 字段 in (id,id,id,id,id)

这样也可以
   不过你要传你要删除行的id

#3


楼上的已经给出解决办法了,楼主试试。

#4


如果你是用DataGridViewCheckBox选择的话就用2楼的方法
如果dataGridView允许多行选择的话,就试下以下方法。

            SqlCommand cmd = new SqlCommand(string.Empty, sqlcon);
            SqlTransaction tran = cmd.Transaction;
            try
            {
                for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                {
                    cmd.CommandText = "delete tb1 where 序号=" + dataGridView1.SelectedRows[i].Cells[0].ToString();
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
                MessageBox.Show("删除成功!  ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch(Exception ex)
            {
                tran.Rollback();
                MessageBox.Show("删除失败!  " + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

#5


2楼正解
不过楼主为什么要每删除一条就要重新绑定数据源呢  
弄个进度条显示删除进度  操作完成后再绑定不好点?
频繁的开启和关闭数据库连接  如果要删除的数据太多  还不慢死

#6


循环遍历选中行数,再获取到当前行的dt1列数据,然后删除
/// <summary>
        /// 删除用户信息方法
        /// </summary>
        private void DeleteUserInfo()
        {
            if (MessageBox.Show("确认要删除选择的记录吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                int selectNum = this.dgvUserInfo.SelectedRows.Count;
                for (int i = 0; i < selectNum; i++)
                {
                    int uid = Convert.ToInt32(dgvUserInfo.SelectedRows[i].Cells[0].Value.ToString());
                    byte[] byteId = new byte[1];
                    byteId[0] = (byte)uid;
                    byte[] byteData = BllManager.GetSendByte(byteId, Convert.ToInt32(MainState.UserInfo), Convert.ToInt32(UserInfos.DeleteUserInfo), 0);
                    ClientConnService.AddSendQueueManager(byteData);
                }
            }
        }

#7


关键代码就是这里

int selectNum = this.dgvUserInfo.SelectedRows.Count;
//得到选中的行数
for (int i = 0; i < selectNum; i++)
{
   //得到第i行第一列的值,即id标识(应为我这里第一列是唯一标识)
   int uid = Convert.ToInt32(dgvUserInfo.SelectedRows[i].Cells[0].Value.ToString());
   //执行删除
}

#8


datagridview删除多行数据

#9


引用 2 楼  的回复:
delete 表名 where 字段 in (id,id,id,id,id)

这样也可以
   不过你要传你要删除行的id


你不能确定"delete 表名 where 字段 in (id,id,id,id,id)”这句的id的个数好吧!你自己再想想