情况就是这样:
我有一个链接到TableAdapter的DataGridView。由于Table的某些列是从DataGridView隐藏的,因此必须在将更改提交到数据库之前添加隐藏列的内容(其中一些是外键)。
我尝试做的是拦截添加的行,将数据添加到相关列,然后继续提交更改。这是代码:
var createdRows = (ExampleDataset.ExampleTableDataTable)this.ExampleDataset.ExampleTable.GetChanges(DataRowState.Added);
try
{
if(createdRows != null)
{
foreach(var row in createdRows)
{
row.ID_OTHER_TABLE = this.idOtherTable;
row.REF_OTHER_TABLE = this.refOtherTable;
}
}
this.exampleTableBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.ExampleDataSet);
this.ExampleDataSet.AcceptChanges();
}
catch(Exception ex)
{
MessageBox.Show("Error updating database: " + ex.Message);
}
通过检查另一个视图中的表并通过调试,我可以看到,正在捕获添加的行,正在编辑的字段,保存到数据库的行,但foreach()
中添加的信息没有得救。
答案 0 :(得分:1)
我会自己回答,但我不能确定这是否有效,因为项目有变化,组件不再成为其中的一部分。话虽这么说,我认为这是完成我想要做的正确方法,基于与其他组件类似的用例。
错误出现在TableAdapter的Update方法中用作参数的对象中,因为应该使用正在进行更改的DataTable。也就是说,使用
this.tableAdapterManager.UpdateAll(this.ExampleDataSet)
它尝试根据DataSet的行当前状态编写更改,但尚未将更改提交给它。正确的方法应该是:
this.exampleTableTableAdapter.Update(createdRows)
现在我明白这就是brinky所指出的,但是在我无法在代码中看到它的那一刻却没有能够修复它。
答案 1 :(得分:0)
我没有看到您使用修改后的数据表数据更新实际数据表的位置 - 您正在创建临时表,并修改其中的数据,但是它不用于在任何地方修改实际数据