Η πρώτη σου προσπάθεια δεν δουλεύει για άλλον λόγο. Η τεχνική του RowUpdated event παίζει μια χαρά, αλλού είναι το πρόβλημα.
Όταν σπας το DataSet σε τρία (dataSetChanged, dataSetDeleted, dataSetAdded) και τρέχει η RowUpdated, τότε το
e.Row("OrderID") = Int32.Parse(cmdGetIdentity.ExecuteScalar())
διαβάζει το @@IDENTITY αλλά αυτό πέφτει μέσα στην αντίστοιχη εγγραφή του πίνακα Orders που βρίσκεται στο dataSetAdded DataSet. Έτσι, η τιμή δεν εμφανίζεται ποτέ μέσα στον πίνακα που είναι binded στο DataGridView κι εσύ βλέπεις (DataSetOrders.Tables("Orders")). Θα το διαπιστώσεις, αν αντί
m_daOrders.Update(dataSetAdded.Tables("Orders"))
κάνεις
m_daOrders.Update(DataSetOrders.Tables("Orders"))
Έτσι λοιπόν, η ButtonUpdate_Click γίνεται
Private Sub ButtonUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonUpdate.Click
AddHandler m_daOrders.RowUpdated, AddressOf HandleRowUpdated
Try
DumpTableContents("Before", DataSetOrders.Tables("Orders"))
m_daOrders.Update(DataSetOrders.Tables("Orders"))
DumpTableContents("After", DataSetOrders.Tables("Orders"))
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
End Sub
Η DumpTableContnets χρησιμεύει για να δεις τα περιεχόμενα του πίνακα ώστε να διαπιστώσεις ότι πραγματικά έχουν τις τιμές που περιμένεις
Sub DumpTableContents(ByVal text As String, ByVal dtWorking As DataTable)
Debug.WriteLine(text)
For Each r As DataRow In dtWorking.Rows
For i As Integer = 0 To r.ItemArray.Length - 1
Debug.Write(String.Format("{0},", r(i)))
Next
Debug.WriteLine()
Next
End Sub
Ουσιαστικά, το πρόβλημά σου ήταν θέμα debugging ώστε να καταλάβεις που ακριβώς οφείλεται το λάθος. Στην προκειμένη περίπτωση, όταν κάνεις GetChanges ώστε να πάρεις τα DataRows από ένα DataSet/DataTable και να τα ρίξεις σε άλλο, δεν κάνεις copy τα reference αλλά δημιουργείς νέα objects.
Vir prudens non contra ventum mingit