Δεν είναι και τόσο σωστή η προσέγγιση σου... Χρησιμοποιείς BindingSource; Αν όχι, τότε θα πρέπει να κάνεις το εξής:
Βάζεις το BindingSource control και θέτεις το DataSource property του να βλέπει τα data σου. Κατόπιν κάνεις bind το DataGridView πάνω στο BindingSource.
Αν έχεις ήδη το BindingSource, τότε κακώς δεν το χρησιμοποιείς. Είναι ένα *μαγικό* control το οποίο λειτουργεί ως κεντρικό hub των data που κάνεις bind. Πάνω σε αυτό κάνουν bind όόόλα τα controls (που θέλουν να δείξουν τα data που περιέχει). Έχει δύο βασικά properties Filter και Sort στα οποία όταν δώσεις κατάλληλες τιμές, αυτόματα ενημερώνονται όλα τα controls που είναι binded πάνω του. Επιπρόσθετα, υπάρχει το Current property που δείχνει το τρέχον item. Μάντεψε! Είναι αυτό που δείχνει το selected row στο DataGridView! Οπότε ανά πάσα στιγμή έχεις το επιλεγμένο row, δεν χρειάζεται να ψάχνεις στα rows και columns του DataGridView! Επιπρόσθετα, το BindingSource έχει πλήθος από events που μπορούν να σου χρησιμεύσουν.
Άρα η λογική σου θα είναι η εξής: Στο click event του DataGridView (ή σε οποιοδήποτε event που σημαίνει ότι ο χρήστης θέλει να πάρει τα details), ρωτάς το BindingSource ποιό είναι το current row, το μετατρέπεις κατάλληλα ώστε να έχεις τα πεδία, φωνάζεις τη φόρμα και της περνάς ως παράμετρο την εγγραφή. Στη νέα φόρμα κάνεις extra queries για τα details.
Ποιό είναι το πλεονέκτημα αυτής της λύσης: Κάνεις decoupling τα controls μεταξύ τους. Πολύ σημαντικό! Η λογική σου θα συνεχίζει να παίζει άσχετα αν αποφασίσεις να αλλάξεις το DataGridView με κάτι άλλο ή να αλλάξεις τις συνθήκες κάτω από τις οποίες εμφανίζονται τα details.
Vir prudens non contra ventum mingit