我创建了一个数据集,在设计器中我创建了数据库中存在的关系和外键。 基本上,我有一个与价格表有关系的产品。他们共享的关键字段是价格表中的IdProduct。在产品的填充/获取中,我返回价格字段。
我还有一个DataGrid,它使用一个使用该表的BindingSource。一切都正确显示,当我双击数据网格中的一行时,我打开一个标签表格,其中包含所选记录的详细视图。
此时用户可以对记录进行更改,并将它们正确传播回BindingSource。问题是TableAdapter不包含适当的更新,因此我无法使用数据集调用TableAdapter.Update方法,就像我创建一个不使用连接的tableadapter一样。
我最好如何处理这种情况。
同时我无法获得任何修改过的行:
dTiendasDs.ProductosDataTable modified = (dTiendasDs.ProductosDataTable)
dTiendasDs.Productos.GetChanges(DataRowState.Modified);
modified始终为null
谢谢,
答案 0 :(得分:0)
就个人而言,我总是在所有行上做一个foreach ..
然后每行检查 Row.RowState 属性。
当心!!在询问rowstate之前总是打电话 Row.EndEdit()因为其他条件没有改变,所以没有修改rowstate ..(这可能是你原来的问题)。
如果不变 - > gt;什么
如果删除 - >删除声明
如果修改 - >更新声明
如果添加 - >插入声明
您可以根据表中的列动态生成SQL。
您甚至可以通过比较当前值和原始值来检查是否必须更新值。
object o1 = pRow[fCol, DataRowVersion.Current];
object o2 = pRow[fCol, DataRowVersion.Original];
希望这足以让你前进..
答案 1 :(得分:0)
我还没有找到一个让我高兴的解决方案。
我不知道如何将更新方法合二为一,这样我的两个表在数据集中“连接”(内连接),同时更新。
我遇到的问题是,即使控件数据绑定到productosBindingSource,此bindingSource也没有更新,所以我的最终解决方案是直接使用数据集的行,然后分别更新产品和价格表。这很烦人,我希望有一个独特的更新。
我的代码最终如下。
this.productosBindingSource.EndEdit();
dTiendasDs.Productos[0].idZona =
Convert.ToInt32(zonasCombobox.SelectedValue);
dTiendasDs.Productos[0].Precio =
Convert.ToDouble(this.precioTextBox.Text);
dTiendasDs.Productos[0].EndEdit(); if (dTiendasDs.HasChanges()) { this.productosTableAdapter.UpdateData(dTiendasDs.Productos[0]["nombre"].ToString(), Convert.ToInt32(dTiendasDs.Productos[0]["idZona"]),Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"])); this.preciosTableAdapter.UpdateData( Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"]), Convert.ToDouble(dTiendasDs.Productos[0]["precio"]),IdTienda); } this.dTiendasDs.AcceptChanges();