Μετά από λίγη έρευνα, κοιτάξτε το κουλό που συμβαίνει στο RowsAdded Event:
Σύμφωνα με το βιβλιαράκι "Databinding With Windows Forms 2.0" οπου βρήκα ένα απόσπασμα ισχύει το εξής: The RowsAdded event can be fired for one row at a time if you are programmatically adding rows in a loop, or it can be fired just once for a whole batch of rows being added, such as when you data bind or use the AddCopies method of the rows collection.
Οκ, αρα λοιπόν βρήκαμε οτι όταν κάνουμε databinding το RowsAdded event έχει διαφορετική συμπεριφορά. @%@$%@#$. Για να δούμε όμως, ισχύει τελικά αυτό; Εβαλα το εξής στο RowsAdded Event για να δούμε τι θα γίνει:
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
MsgBox("rowindex:" + e.RowIndex.ToString + " rowcount:" + e.RowCount.ToString)
Next
End Sub
Με την εκτέλεση φαίνεται ξεκάθαρα οτι το event τρέχει ΔΥΟ φορές και μόνο δυο. Τα αποτελέσματα είναι τα εξής (έχω 570 γραμμές που θα μπουν στο datagridview):
rowindex:0 rowcount:1
rowindex:1 rowcount:570
ΕΛΕΟΣ κύριοι που σχεδιάσατε το datagridview! Διαφορετική συμπεριφορά στο programmatic binding, διαφορετική στο declarative, και τρέχει και ΔΥΟ φορές το event; Τελος πάντων, μπορώ τώρα να δέσω τα unbound columns μου στο event αυτό με ένα loop ως εξής:
For Each r As DataGridViewRow In DataGridView1.Rows
' ...εδώ ο καλός ο κώδικας που δένει τα unbound
Next
Και βέβαια, FYI και FMI, μπορεί να χρησιμοποιηθεί και το CellFormatting Event, το οποίο όμως έχει την κακή διάθεση να τρέχει συνεχώς. Ακόμα και αν το περιορισουμε κοιτώντας το Index του column, και πάλι δεν μπορούμε να αποφύγουμε το οτι τρέχει οταν ο δρομέας μας περνάει απλώς πάνω από ένα κελί...
Χαρακτηρίζω το θέμα ως επιλυθέν θεωρώντας οτι το αρχικό πρόβλημα λύθηκε. Παρ'όλα αυτά, θα ήθελα να ακούσω απόψεις για την περίεργη αυτή συμπεριφορά του RowsAdded event.
Σωτήρης Φιλιππίδης
DotSee Web Services