Dataset.Copy()不复制新记录的值

时间:2009-05-20 19:14:41

标签: .net winforms .net-3.5 dataset

我有一个包含多个表的数据集。一张表特别有一个记录。我正在向此数据表添加另一条记录,并使用Dataset.Copy()方法将整个数据集对象复制到另一个实例。

 Dataset2 = DirectCast(Dataset1.Copy(), dsApplication)

但是,从此方法返回的数据集的新副本不正确。新行在那里并且RowState为“Added”,但值为空(这是一个字符串字段)。数据集使用空值保存到数据库。

现在,我有两行。原来的,空白的。如果我将空白文本更改为具有文本并再次启动操作,则原始数据集将该行显示为具有文本,但RowState为Unchanged,第二个数据集再次为此行留空。

有没有人对此行为有解释?为什么不在Dataset.Copy()操作中复制第二行的值?为什么添加文本后第二行的RowState不显示为已修改?

编辑:正在通过datagridview修改原始数据集。如果在我将文本输入datagridview单元格后,在启动复制操作之前单击另一行,它可以正常工作。如果我没有点击另一行,那么它就会失败。在我启动复制操作之前,我调用了datagridview.endedit()方法。它仍然很奇怪,因为即使没有点击另一个单元格,当我调试代码时,原始数据集总是在复制操作之前立即显示正确的值,所以我不明白为什么datagridview根本没有任何影响。

编辑#2:在调试时,我注意到如果我更改gridview中的第一个值,RowState会按预期更改为Modified。但是,对于任何其他行,尽管实际值发生变化,RowState仍保持不变。

2 个答案:

答案 0 :(得分:2)

您是否调用了DataSet.AcceptChanges()方法?我相信您需要这些才能使更改生效......

答案 1 :(得分:0)

问题原来是DataGridView控件的一个问题。调用EndEdit()方法时,DataGridView确实更新了数据集中的值,但由于某种原因,RowState保持为Unchanged。这显然导致Copy()操作忽略该值。我相信这是DataGridView中的一个错误,因为如果编辑网格中的第一行,只有其他行为不会发生这种情况。

为了使它正常工作,而不是调用DataGridView.EndEdit(),我必须在包含DataGridView的窗体上调用Me.Validate()方法。然后,对BindingSource.EndEdit()方法的调用可确保将值传播到基础数据集。这导致RowState被正确地更改为Added或Modified,并且一切正常。

正如我所说,恕我直言,我认为这是DataGridView控件的一个错误...特别是考虑到不一致的行为。我认为应该更好地记录从绑定控件通过绑定源到底层数据集的数据的适当步骤,因为我发现了许多提议的解决方案,但是每个解决方法在被调用的方法上都有细微的差别,它们被调用的对象,以及他们被召唤的顺序。