2010-03-26 46 views
0

我有MS Access數據庫,datagridview顯示項目,兩個複選框列表示數據庫中的是/否列和刷新/ del按鈕。爲什麼會收到併發違規錯誤?

當我嘗試刪除其複選框未被修改的行時,行刪除就好了,當我修改複選框的值時,按下刷新按鈕,然後刪除,行也會刪除。

但是,當我嘗試在修改其複選框值後立即刪除行時,出現了併發衝突異常錯誤。

當複選框的值更改代碼:

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(); 

     } 
} 

刷新按鈕代碼:

public void Refreshdgv() 
     { 
      this.categoriesItemsBindingSource.EndEdit(); 
      this.itemsTableAdapter.Fill(myDatabase01DataSet.Items); 
      this.dataGridView1.Refresh(); 
     } 

刪除按鈕代碼:

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()); 
      } 
    } 

要解決這個問題,我可以叫Refreshdgv()方法代替dataGridView1.Invalidate()。但我不想爲每個複選框點擊dgv刷新!

回答

1

DataSet的delete命令可能檢查原始值。由於您在CellValueChanged事件中手動更新數據庫,因此數據庫中的值與您的DataSet中的原始值不匹配。如果您修改CellValueChanged事件以在您的DataSet中使用update命令,則當您調用Delete時,值應與匹配。

或者,您可以將您的刪除命令更改爲使用不太專有的where子句(例如,WHERE KeySegment0 = @keySegment0 AND KeySegment1 = @keySegment1 ...)。

+0

謝謝,我不應該手動更新我的數據庫,這是問題。我使用tableadapter update命令替換了dgv單元格更改事件中的更新代碼,它起作用。 – DanSogaard 2010-03-26 15:47:34

0

嘗試驗證數據,然後更新它。在此之後,清除你的數據集並填充它,這樣它會刷新你所做的每一個更改的數據網格。