代码之家  ›  专栏  ›  技术社区  ›  netadictos

使用联接和绑定源更新数据集?

  •  0
  • netadictos  · 技术社区  · 15 年前

    我还有一个使用BindingSource的DataGrid,它使用这个表。所有内容都正确显示,当我双击datagrid中的一行时,我会打开一个选项卡式表单,其中包含所选记录的详细视图。
    此时,用户可以对记录进行更改,并将更改正确地传播回BindingSource。问题是TableAdapter不包含相应的更新,因此我无法使用dataset调用TableAdapter.update方法,就像我在不使用联接的情况下创建TableAdapter一样。

    我怎样才能最好地处理这种情况。

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

    2 回复  |  直到 15 年前
        1
  •  0
  •   Julian de Wit    15 年前

    就我个人而言,我总是在所有的行上做一个foreach。。
    然后每行我检查一下 财产。

    当心!!总是打电话 因为值已更改而询问rowstate之前,不会修改rowstate。。(也许这是你最初的问题)。


    如果删除->删除语句
    如果修改->更新语句
    如果添加->插入语句

    您可以根据表中的列动态生成SQL。
    您甚至可以通过比较当前值和原始值来检查值是否必须更新。

    object o1 = pRow[fCol, DataRowVersion.Current];
    object o2 = pRow[fCol, DataRowVersion.Original];
    


    希望这足够让你走了。。

        2
  •  0
  •   Community CDub    4 年前

    我还没有找到一个让我完全满意的解决办法。

    我遇到的问题是,即使控件被数据绑定到productosBindingSource,此bindingSource也不会更新,因此我的最终解决方案是直接使用数据集的行,然后分别更新产品表和价格表。这很烦人,我希望有一个独特的更新。

    最后我的代码如下。

    this.productosBindingSource.EndEdit();

            dTiendasDs.Productos[0].idZona =
    

    转换为32(zonasCombobox.SelectedValue);

            dTiendasDs.Productos[0].Precio =
    

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