C# 为什么会出现并发冲突错误?

C# 为什么会出现并发冲突错误?,c#,datagridview,concurrency,C#,Datagridview,Concurrency,我有MS Access db、显示项的datagridview、表示db中是/否列的两个复选框列,以及刷新/删除按钮 当我尝试删除其复选框未被修改的行时,该行删除得很好,当我修改复选框值时,按刷新按钮,然后按delete,该行删除得也很好 然而,当我试图在修改一行的复选框值后立即删除该行时,我得到了并发冲突异常错误 当复选框值更改代码时: private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEven

我有MS Access db、显示项的datagridview、表示db中是/否列的两个复选框列,以及刷新/删除按钮

当我尝试删除其复选框未被修改的行时,该行删除得很好,当我修改复选框值时,按刷新按钮,然后按delete,该行删除得也很好

然而,当我试图在修改一行的复选框值后立即删除该行时,我得到了并发冲突异常错误

当复选框值更改代码时:

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());
            }
    }
删除按钮代码:

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());
            }
    }
private void delBtn\u单击(对象发送者,事件参数e)
{
尝试
{
int cnt=dataGridView1.SelectedRows.Count;
对于(int i=0;i0)
{
this.dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index);
}
}
这个。Validate();
this.categoriesItemsBindingSource.EndEdit();
this.itemsTableAdapter.Update(this.myDatabase01DataSet.Items);
this.myDatabase01DataSet.AcceptChanges();
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}

要解决此问题,我可以调用Refreshdgv()方法代替dataGridView1.Invalidate()。但我不希望每次单击复选框都刷新dgv

数据集的delete命令可能正在检查原始值。由于您在CellValueChanged事件中手动更新数据库,因此数据库中的值将与数据集中的原始值不匹配。如果修改CellValueChanged事件以在数据集中使用update命令,则调用Delete时,这些值应匹配


或者,您可以更改delete命令以使用不太排他性的where子句(例如,
where KeySegment0=@KeySegment0和KeySegment1=@KeySegment1…
)。

尝试验证数据,然后更新它。之后,清除数据集并填充数据,这样每次更改都会刷新数据网格。

谢谢,我不应该手动更新数据库,这就是问题所在。我用tableadapter update命令替换了dgv cell changed事件中的更新代码,它可以正常工作。