I have a datagridview with 4 columns. 1 of which is a manually added deletecheckbox column (The first column). There's some strange behavior when I try and delete multiple rows based on the checked value. For example, if I check 2 rows, 1 gets deleted. If I check 5 rows, 3 gets deleted. So basically half of what I click gets deleted. The ones don't get deleted are remained checked, and I would have to click the update button again to remove more. If I want to delete ALL checked checkboxes with one button click, what do I need to fix?
Entire Button Click Event:
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmdAdd = new SqlCommand("insert into Josh_REL_Table (UserID, RoleName) Values (@UserID,@RoleName)", con);
SqlCommand cmdEdit = new SqlCommand("update Josh_Rel_Table SET UserID = @UserId, RoleName=@RoleName where RelationID=@RelationID", con);
con.Open();
cmdAdd.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RelationID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RelationID", SqlDbType.VarChar);
if (DGV1.RowCount >= 1)
{
for (int x = 0; x < DGV1.RowCount - 1; x++)
{
if (DGV1.Rows[x].Cells[1].Value.ToString() == "" || DGV1.Rows[x].Cells[1].Value == null)
{
cmdAdd.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdAdd.Parameters["@RoleName"].Value = comboBox1.Text;
cmdAdd.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdAdd.ExecuteNonQuery();
}
if (!DGV1.Rows[x].IsNewRow)
{
cmdEdit.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdEdit.Parameters["@RoleName"].Value = comboBox1.Text;
cmdEdit.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdEdit.ExecuteNonQuery();
}
if (Convert.ToBoolean(DGV1.Rows[x].Cells[0].Value))
{
List<DataGridViewRow> selectedRows = (from newRow in DGV1.Rows.Cast<DataGridViewRow>() where Convert.ToBoolean(newRow.Cells["Delete"].Value) == true select newRow).ToList();
if (MessageBox.Show(string.Format("Do you want to delete {0} rows?", selectedRows.Count), "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
foreach (DataGridViewRow newRow in selectedRows)
{
using (SqlCommand cmd = new SqlCommand("DELETE FROM Josh_REL_Table WHERE RelationID = @RelationID", con))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@RelationID", newRow.Cells["RelationID"].Value);
cmd.ExecuteNonQuery();
DGV1.Rows.Remove(newRow);
}
}
}
}
}
}
MessageBox.Show("Record updated!");
con.Close();
}