2010-03-26 2 views
0

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!

Répondre

1

La commande delete de votre DataSet vérifie probablement les valeurs d'origine. Comme vous mettez à jour votre base de données manuellement dans l'événement CellValueChanged, les valeurs de votre base de données ne correspondent pas aux valeurs d'origine de votre DataSet. Si vous modifiez l'événement CellValueChanged pour utiliser la commande update dans votre DataSet, les valeurs doivent correspondre lorsque vous appelez Delete.

Vous pouvez également modifier votre commande delete pour utiliser une clause where moins exclusive (par exemple, WHERE KeySegment0 = @keySegment0 AND KeySegment1 = @keySegment1 ...).

+0

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

0

Essayez de valider les données, puis mettez-le à jour. Après cela, effacez votre ensemble de données et remplissez-le afin qu'il actualise la grille de données toutes les modifications que vous avez apportées.

Questions connexes