Invece che incartarti sui problemi del DataGrid ti conviene eliminare tutto in un solo colpo usanod un oggetto ADODB.Command oppure direttamente dalla connessione ADO.

Scegliere poi i record da eliminare utilizzando
numberofrow = DataGrid1.ApproxCount
mi pare quanto meno temerario, ed è comunque inutile se fai come sopra.

Il modo SICURO per eliminare correttamente dei record è riferirsi a questi utilizzando la chiave primaria, visto che c'è e puoi utilizzarle.
Naturalmente il tutto 'condito' all'interno di una transazione. Ovvero:

codice:
Dim bOnTransaction As Boolean
Dim sSQL As String
Dim oCursorLocation As integer

On Error Goto ERR_HANDLER

oCursorLocation = cs.CursorLocation ' prendo nota dell'impostazione esistente
cs.CursorLocation = AdUseServer
cs.BeginTrans
bOnTransaction = True

' prima eliminazione
sSQL = "DELETE FROM tabella1 WHERE ChiavePrimaria = " & pk
cs.Execute(sSQL)

' seconda eliminazione
sSQL = "DELETE FROM tabella2 WHERE ChiavePrimaria = " & pk
cs.Execute(sSQL)

cs.CommitTrans
cs.CursorLocation = oCursorLocation ' rimetto tutto a posto

' se sono qui, tutto è andato bene!

On Error Goto 0
Exit Sub

ERR_HANDLER:
' Qualcosa è andato storto, annullo tutto
If bOnTransaction Then
    cs.CursorLocation = oCursorLocation
    cs.RollBackTrans
End If
Ho scritto al volo, quindi verifica bene PRIMA

Ovviamente dovrai poi fai il requery dei 2 recordset, distruggere gli oggetti, insomma le solite cose.