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