使用join和bindingsource更新数据集?

时间:2009-08-06 09:36:16

标签: .net data-binding dataset

我创建了一个数据集,在设计器中我创建了数据库中存在的关系和外键。 基本上,我有一个与价格表有关系的产品。他们共享的关键字段是价格表中的IdProduct。在产品的填充/获取中,我返回价格字段。

我还有一个DataGrid,它使用一个使用该表的BindingSource。一切都正确显示,当我双击数据网格中的一行时,我打开一个标签表格,其中包含所选记录的详细视图。
此时用户可以对记录进行更改,并将它们正确传播回BindingSource。问题是TableAdapter不包含适当的更新,因此我无法使用数据集调用TableAdapter.Update方法,就像我创建一个不使用连接的tableadapter一样。

我最好如何处理这种情况。

同时我无法获得任何修改过的行:

       dTiendasDs.ProductosDataTable modified = (dTiendasDs.ProductosDataTable)
dTiendasDs.Productos.GetChanges(DataRowState.Modified);

modified始终为null

谢谢,

2 个答案:

答案 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();