MS 액세스 db, 항목을 표시하는 datagridview, db의 예/아니요 열을 나타내는 두 개의 확인란 열 및 새로 고침/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 새로 고침을 원하지 않습니다!
감사합니다. 문제가 직접 수동으로 db를 업데이트하면 안됩니다. 나는 dgv cell changed tableadapter update 명령으로 update 코드를 바꿨다. – DanSogaard