【问题标题】:Databinding, dataset with datarelations, and refreshing single DataTable from DB数据绑定、具有数据关系的数据集以及从 DB 刷新单个 DataTable
【发布时间】:2009-09-02 14:18:07
【问题描述】:

简而言之:我有一个内部包含多个 DataTables 的 DataSet,它们通过多个 DataRelations 连接。我已经在这个 DataSet 上使用数据绑定创建了一个表单,你可以说它非常复杂。

接下来是场景:表单的主要目的是插入新记录。要插入它,必须设置各种父子关系。数据绑定一切正常,但问题是下一个:当用户想要为其中一个父子关系输入一个新的“子”时,新表单打开,他输入它,yada yada yada, - 它作品。麻烦的是 - 我应该如何将新数据恢复到原始表单,以显示在父子组合框中?

我知道的一种方法是刷新整个表单;但我正在寻找一种解决方案来仅刷新包含该数据的 DataTable。我尝试从 DB 中获取新数据的新 DataTable,并将其与 DataSet 中的 DataTable 合并,但它不起作用:抛出“一个子行有多个父项”异常:

// basically just a Select * using dataadapter,
// nothing programmatically added 
DataTable table = tableModule.GetPlainTable(); 
existingDataSet.Tables["tableName"].Merge(table);

我正在尝试做的等效示例是有一个订单表单,上面有客户组合框。在组合框的右侧,有一个“添加”按钮,可以打开一个新的“添加客户”表单。顺便提一下(也许它是相关的),在数据库中,“客户”表与“城市”表相关,并且该数据也在订单表单上的数据绑定中链接......

编辑:我能想到的一种解决方案是“手动”循环遍历新的 DataTable,并在 DataSet 中找到不在原始 DataTable 中的所有行,但我不确定这是否可行......

任何帮助/建议/解释/推动正确的方向将不胜感激:)

【问题讨论】:

    标签: c# data-binding merge datatable dataset


    【解决方案1】:

    嗯,我有点解决了在第二种形式插入时手动复制行的问题...我创建了一个带有对象集合(行项数组)的事件,并在第一种形式中注册了该事件的处理程序,其中我通过以下方式手动添加新行:

    data.Tables["tableName"].Rows.Add(e.RowItems);
    

    之后我在该行上调用 AcceptChanges() 以使其状态保持不变,而不是已添加...

    这个解决方案,虽然快速而肮脏,但有效。问题是,我认为有一个更好、更“数据绑定”的哲学导向... :=)

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 2010-10-14
      • 2017-10-20
      • 1970-01-01
      • 2012-01-18
      • 2015-11-12
      • 2010-10-29
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多