简而言之:我有一个内部有多个DataTable的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);
我正在尝试做的同样的例子是订购表格,上面有客户组合框。在组合框的右侧,有一个“添加”按钮,可以打开一个新的“添加客户”表单。仅提及(可能是相关的),在DB内部,“Customers”表与“Cities”表相关,并且该数据也在Orders表单的数据绑定中链接......
编辑:我能想到的一个解决方案是在整个新的DataTable中“手动”循环,并查找DataSet中原始DataTable中没有的所有行,但我不确定这是否可行... < / p>任何帮助/建议/解释/推动正确的方向将非常感谢:)
答案 0 :(得分:0)
嗯,我在第二种形式插入时解决了手动行复制的问题...我创建了一个带有对象集合的事件(行项目数组),并在第一个表单中注册了该事件的处理程序,其中我通过以下方式手动添加新行:
data.Tables["tableName"].Rows.Add(e.RowItems);
之后我在该行上调用AcceptChanges()使其状态为Unchanged,而不是添加...
这种解决方案虽然快速而肮脏,但却有效。问题是,我认为有一个更好的,更“数据化”的哲学导向一个......:=)