J'ai MS Access db, datagridview qui affiche des éléments, deux colonnes de case à cocher qui représente les colonnes Oui/Non dans les boutons db et refresh/del.Pourquoi une erreur de violation de concurrence se produit-elle?
Lorsque j'essaie de supprimer une ligne que ses cases à cocher n'a pas été modifiée, la ligne supprime très bien, aussi lorsque je modifie la valeur de la case à cocher, appuyez sur le bouton d'actualisation, puis supprime également la ligne.
Toutefois, lorsque j'essaie de supprimer une ligne juste après avoir modifié sa valeur de case à cocher, j'obtiens une erreur d'exception de violation de concurrence.
Lorsque la valeur de la case code modifié:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "sales")
{
DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells["sales"];
bool _pSale = (Boolean)checkCell.Value;
string connstring = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", Path.Combine(Directory.GetCurrentDirectory(), "MyDatabase01.accdb"));
OleDbConnection conn = new OleDbConnection(connstring);
conn.Open();
string sqlqry = "UPDATE Items SET pSale = " + _pSale + " WHERE p_Name = '" + this._pName + "'";
OleDbCommand upd = new OleDbCommand(sqlqry, conn);
upd.ExecuteNonQuery();
conn.Close();
//dataGridView1.Invalidate();
}
}
Code bouton Actualiser:
public void Refreshdgv()
{
this.categoriesItemsBindingSource.EndEdit();
this.itemsTableAdapter.Fill(myDatabase01DataSet.Items);
this.dataGridView1.Refresh();
}
Code bouton Supprimer:
private void delBtn_Click(object sender, EventArgs e)
{
try
{
int cnt = dataGridView1.SelectedRows.Count;
for (int i = 0; i < cnt; i++)
{
if (this.dataGridView1.SelectedRows.Count > 0)
{
this.dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index);
}
}
this.Validate();
this.categoriesItemsBindingSource.EndEdit();
this.itemsTableAdapter.Update(this.myDatabase01DataSet.Items);
this.myDatabase01DataSet.AcceptChanges();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Pour résoudre ce problème, je peux appeler la méthode Refreshdgv() à la place de dataGridView1.Invalidate(). Mais je ne veux pas que le dgv se rafraîchisse pour chaque clic de case à cocher!
Merci, je ne devrais pas mettre à jour manuellement ma base de données qui était le problème. J'ai remplacé le code de mise à jour dans l'événement changé de cellule dgv avec la commande update de tableadapter et cela fonctionne. – DanSogaard