Internamente hace lo que comentás.
Si querés usar un objeto Button en vez de un BindingNavigatorSaveItem, meté el código que te pasé en el evento Click del Button. Si querés podés ocultar el BindingNavigator, y te queda como querés.
Ahora observando tu código tenemos lo siguiente:
Código vb:
Ver originaladapter.Update(dataset, "tabla2")
adapter.Fill(dataset, "tabla2")
Acá debés capturar la excepción DBConcurrencyException. Quedaría así:
Código vb:
Ver originalTry
adapter.Update(dataset, "tabla2")
adapter.Fill(dataset, "tabla2")
Catch ex As DBConcurrencyException
MessageBox.Show("Error de concurrencia")
End Try
Código vb:
Ver originalSub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)
If args.RecordsAffected = 0 Then
args.Row.RowError = "Violacion concurrencia optimista"
args.Status = UpdateStatus.SkipCurrentRow
End If
End Sub
Esto está mal. El mensaje sería "0 registros afectados.".
Incluso no capturás ninguna excepción.
Al ejecutar la aplicación, y probarla, modifica la tabla, y antes de presionar el botón Guardar, modificá la base de datos (ubicada en Projecto/bin/debug o Projecto/bin/release). Porque si modificás la BD original estarías errándole de entrada en el testing.
PD: Si estás haciendo una App nueva, te diría que utilices los controles/objetos que te comenté (puro autogenerado, en 1 minuto tenés el formulario hecho). No reinventés la rueda.