0

我保證我已經看過聲稱這個問題的bazillion帖子,所以請原諒我,我仍然難倒。VB.net DataRow.RowState不會更新

我有一個包含強類型數據集的VS2008智能設備項目。用戶可以輸入值並保存,每次在數據集中創建新記錄。如果用戶希望編輯值,則會顯示一個模態子窗體,並帶有多個組合框,其中包含可接受輸入的可能值以編輯該行。每個組合框都以下面的方式綁定在子窗體的構造函數中:

With cmbSize 
     .DataSource = frmMain.dstConfig.Sizes 
     .DisplayMember = "Display" 
     .ValueMember = "Value" 
     .DataBindings.Add("SelectedValue", trowNewRow, "SIZE", True, DataSourceUpdateMode.OnPropertyChanged) 
End With 

dstConfig是包含約束的表的數據集。綁定到源代碼的顯示和值成員工作正常。

trowNewRow是對用戶啓動編輯過程時從主窗體傳遞的數據集中的行的引用,通過將該行作爲參數「ByRef」傳遞給子窗體。強打字被保存下來。在我看來,可能會出現某種斷開,我不知道這種情況何時發生。我通過對數據集執行「選擇」過程並通過與要編輯的行對應的唯一ID字段進行過濾來傳遞參考。結果是與數據集相同模式的強類型行的單項數組,其中第一個(也是唯一)項作爲我的對象傳遞。

用戶通過單擊確定按鈕提交更改後,會觸發過程以評估是否實際執行了更改。我認爲這樣做的最好方法是檢查trowNewRow的RowState。但是,無論更改如何,RowState都會保持「添加」狀態。手動檢查行的值表示更改確實已記錄。我已驗證trowNewRow的AcceptChanges過程沒有被我的任何代碼明確地調用。

我曾嘗試以下: 1)調用trowNewRow 的EndEdit中方法2)手動執行上調用的組合框BindingManagerBase的EndCurrentEdit過程的組合框 3.)一個WriteValue對象 4。 )上述各項組合

預先感謝您的任何想法或解決方案。

+1

代替這兩個長段落的相關代碼可能會更好地說明問題並減少乏味。如果行狀態是已添加,則表示dataadapter尚未更新數據庫。由於它是一個新的行,所以在你保存之前它仍然是一個新的行(不管有多少編輯/改變)。 – Plutonix

回答

1

A DataRow包含兩組數據 - 原始和當前 - 和RowState反映它們之間的關係。如果沒有原始數據但有當前數據,則RowStateAdded。正如@Plutonix所說,即使您做出進一步更改,編輯當前數據的數量也不會添加原始數據,因此RowState仍爲Added。如果沒有當前數據但有原始數據,則RowStateDeleted。如果當前數據與原始數據匹配,則RowStateUnchanged,否則爲Modified

當你調用數據適配器或表適配器上Update,該InsertCommand爲每個Added行執行的UpdateCommand爲每個Modified行執行和DeleteCommand爲每個Deleted行執行。保存成功後,適配器將隱式調用AcceptChanges。這將從DataTable中刪除所有Deleted行,並將AddedModified行中的當前值複製到原始值上,將RowState更改爲Unchanged

因此,RowState用於跟蹤自上次保存到數據庫以來的更改。除非每次編輯後都將這些更改保存到數據庫,否則無法使用它來確定用戶是否在UI中進行了任何更改。如果你想要更細緻的變更跟蹤,那麼你必須自己實現它。就我個人而言,在這些情況下,我並沒有約束,而是等到用戶單擊確定以將數據推送到DataRow。這也可以讓你取消最新的編輯而不會丟失先前的編輯。