2009-05-20 58 views
0

我有一個包含多個表的數據集。特別是一張桌子上有一張唱片。我將另一條記錄添加到此數據表中,並使用Dataset.Copy()方法將整個數據集對象複製到另一個實例。Dataset.Copy()不復制新記錄的值

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

然而,從這個方法返回的數據集的新副本是不正確的。新行在那裏,並且具有「已添加」的RowState,但值爲空(這是一個字符串字段)。數據集以空白值保存到數據庫。

現在,我有兩行。原來的,還有空白的。如果我將空白文本更改爲具有文本並再次啓動操作,則原始數據集將該行顯示爲具有文本,但RowState未更改,並且第二個數據集對於該行再次爲空。

沒有人有這種行爲的解釋?爲什麼不是在Dataset.Copy()操作中複製第二行的值?爲什麼添加文本後第二行的RowState不顯示爲已修改?

編輯:原始數據集被通過一個DataGridView修改。如果在將文本輸入到datagridview單元格後,我在啓動複製操作之前單擊另一行,它可以正常工作。如果我不點擊另一行,那麼它會失敗。在我開始複製操作之前,我調用datagridview.endedit()方法。這仍然很奇怪,因爲即使沒有點擊到另一個單元格,當我調試代碼時,原始數據集在複製操作之前總是顯示正確的值,所以我不明白datagridview爲什麼會有任何影響。

編輯#2:調試時,我注意到,如果我改變在GridView的第一個值,該RowState的被改爲修改,符合市場預期。但是,對於其他任何行,儘管實際值發生更改,但RowState仍保持不變。

回答

0

的問題竟然是用DataGridView控件的問題。在調用EndEdit()方法時,DataGridView確實更新了數據集中的值,但出於某種原因,RowState保持不變。這顯然導致該值被Copy()操作忽略。我相信這是DataGridView中的一個錯誤,因爲如果編輯網格中的第一行,只有其他行不會發生此行爲。

爲了使它正常工作,而不是調用DataGridView.EndEdit(),我必須調用包含DataGridView的窗體上的Me.Validate()方法。然後,調用BindingSource.EndEdit()方法確保將值傳播到底層數據集。這會導致RowState正確更改爲已添加或已修改,並且一切正常。

正如我所說,恕我直言,我相信這是一個與DataGridView控件的錯誤...尤其是考慮到不一致的行爲。我相信通過綁定源將數據從綁定控件適當地獲取到底層數據集的步驟應該有更好的記錄,因爲我找到了很多提出的解決方案,但每個方法在被調用的方法,被調用的對象,以及它們被調用的順序。

2

你調用DataSet.AcceptChanges()方法?我相信你需要使更改生效...

+0

調用AcceptChanges()方法將RowState設置爲「未更改」,並且行將不可用於數據庫插入或更新命令。這似乎是一個與datagridview相關的錯誤,但我還沒有弄明白。 – NYSystemsAnalyst 2009-05-21 14:40:02