我有MS Access数据库,显示项目的datagridview,数据库中表示是/否列的两个复选框列,以及刷新/删除按钮。
当我尝试删除其复选框未被修改的行时,该行删除就好了,当我修改复选框值时,按下刷新按钮,然后删除,该行也会删除。
但是,当我尝试在修改其复选框值后立即删除一行时,我会收到并发冲突异常错误。
当复选框值更改代码时:
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刷新!
答案 0 :(得分:1)
DataSet的delete命令可能会检查原始值。由于您在CellValueChanged事件中手动更新数据库,因此数据库中的值将与DataSet中的原始值不匹配。如果修改CellValueChanged事件以在DataSet中使用update命令,则在调用Delete时值应匹配。
或者,您可以更改删除命令以使用较少排他的where子句(例如WHERE KeySegment0 = @keySegment0 AND KeySegment1 = @keySegment1 ...
)。
答案 1 :(得分:0)
尝试验证数据然后更新它。之后,清除数据集并将其填满,这样每次更改都会刷新数据网格。