我在C#中的DataGridView中有一个数据表 . 我用从MySql数据库获得的值填充了此表 . 现在,它可以成功检索数据库表,并在我向WinForm端的数据表添加任何新值后添加到该表 . 这是用于此目的的代码:
dbDataset.RowChanged += new DataRowChangeEventHandler(Row_Changed); // dbDataset is my datatable name
和
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
// here sda is my MySqlDataAdapter
try
{
MySqlCommandBuilder cmdb = new MySqlCommandBuilder(sda);
dbDataset.GetChanges();
dbDataset.GetChanges(DataRowState.Added);
dbDataset.GetChanges(DataRowState.Deleted);
dbDataset.GetChanges(DataRowState.Detached);
dbDataset.GetChanges(DataRowState.Modified);
dbDataset.GetChanges(DataRowState.Unchanged);
sda.Update(dbDataset);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
但是现在我发现当我想从表中删除任何行时,例如我选择一行并按“删除”键,它会在屏幕上显示它被删除,但是一旦我重新加载我的WinForm,它仍然存在 . 显然,它没有从数据库中删除所选行 . 为此,经过一些搜索,我添加了以下部分:
dbDataset.RowDeleted += new DataRowChangeEventHandler(Row_Deleted);
和
private static void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
dbDataset.AcceptChanges();
}
通过调试,我发现当我按"delete"键时,它进入 Row_Delete 函数,然后进入 Row_Changed 函数,但抛出异常,说:
Additional information: Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.
我搜索了当前选择的行索引,以便我可以使用DataRow.delete方法,如:
CurrencyManager xCM = = (CurrencyManager)this.BindingContext[this.dataGridView1.DataSource, this.dataGridView1.DataMember];
在 Row_Deleted 函数中我添加了:
DataRowView xDRV = (DataRowView)xCM.Current;
DataRow xDR = ((DataRowView)xCM.Current).Row;
xDR.Delete();
但是它给出了null异常,说dataGridView1的数据源不能为null .
有没有想过如何从数据库中删除选定的行?提前致谢 .