Τα καλά ή τα κακά νέα;
Τα καλά νέα είναι ότι υπάρχουν δύο τρόποι για να ταξινομήσεις ένα DataGridView πάνω στην τιμή που δείχνει ένα ComboBox column (για την ακρίβεια αυτοί οι δύο τρόποι ισχύουν για όλα τα columns που δείχνουν "επεξεργασμένες" τιμές, πχ computed-unbound columns)
O πρώτος τρόπος είναι να χρησιμοποιήσεις την μέθοδο Sort του DataGridView περνώντας ένα IComparer method. Ο δεύτερος τρόπος είναι να χρησιμοποιήσεις το SortCompare event. Και για τους δύο τρόπους θα βρεις αρκετό υλικό στο MSDN
Τα κακά νέα είναι ότι αυτοί οι δύο τρόποι δεν δουλεύουν όταν το DataGridView είναι binded... Οπότε, θα πρέπει μέσω κώδικα να το κάνεις populate και αντίστοιχα, όταν ο χρήστης κάνει αλλαγές να περνάς πίσω τις τιμές στο source. Ακούγεται εύκολο αλλά δεν είναι και τόσο.
Ο λόγος που εν γένει δεν υποστηρίζεται τέτοιου είδους sorting δεν έχει να κάνει με το DataGridView όσο με τον binding μηχανισμό. Το DataGridView είναι χαζό και δείχνει ότι του δώσει το BindingSource. Αυτό με τη σειρά του δεν ταξινομεί τα data αλλά περνάει το "request" ταξινόμησης στο DataView του DataTable. H Sort μέθοδος του DataView (που κάνει τη δουλειά) δεν έχει τρόπο να διαβάσει τη lookup τιμή που υπάρχει για κάποιο FK καθώς τα μόνα πεδία που γνωρίζει είναι αυτά του DataTable.
Αν σου είναι απαραίτητη η ταξινόμηση σε αυτό το πεδίο, μπορείς να κάνεις bind σε κάποιο database view που θα δίνει έτοιμες τις τιμές. Βέβαια, έτσι δεν θα μπορείς να κάνεις in-place editing στα data rows, θα πρέπει να ανοίγεις ξεχωριστή φόρμα με την εγγραφή σε details. Προσωπικά δεν με χαλάει αυτή η τεχνική γιατί γενικά δεν συμπαθώ το in-place editing.
Vir prudens non contra ventum mingit