Λοιπόν, το σενάριο:
Έχουμε έναν πίνακα που έχει ας πούμε Customers. Θέλουμε να αλλάζουμε το χρώμα του κάθε DataGridViewRow βάσει της τιμής σε κάποιο πεδίο (πχ CredibilityID). Αυτό το πεδίο είναι FK και τα αντίστοιχα χρώματα βρίσκονται στον master πίνακα.
Μέχρι τώρα, φτιάχνω ένα dictionary που έχει ως key το FK ID και ως value το System.Drawing.Color που διαβάζω από το master πίνακα. Κατόπιν με ένα loop στο Rows collection του DataGridView κάνω set το Βackcolor χρησιμοποιώντας το FK ID
Dim myColorList As Dictionary(Of Integer, System.Drawing.Color) = GetColorList()
For Each row As DataGridViewRow In CustomerDataGridView.Rows
Dim colorKey As Integer = CType(row.Cells.Item(0).Value, Integer)
row.DefaultCellStyle.BackColor = myColorList(colorKey)
Next
H λύση είναι αξιοπρεπής δεδομένου ότι το DataGridView δείχνει μερικές δεκάδες γραμμές και είναι για read-only use.
Αυτό όμως που έχω φαγωθεί να κάνω είναι να πετύχω να γίνεται set το Backcolor μέσω databinding. Σε ένα textbox, αυτό γίνεται κάπως έτσι:
Me.TextBox1.DataBindings.Add(New System.Windows.Forms.Binding("BackColor", Me.CustomerBindingSource, "CredibilityColor", True))
Όμως στο DataGridView υπάρχουν δύο tricky σημεία:
- Το χρώμα βρίσκεται στον master πίνακα (οκ, αυτό είναι doable, από detail row μπορούμε να βγούμε στη master)
- Πρέπει να πεις κάτι σαν
CustomerDataGridView.DataBindings.Add(New System.Windows.Forms.Binding("DefaultCellStyle.BackColor", Me.CustomerBindingSource, "CredibilityColor", True))
που όμως το "DefaultCellStyle.BackColor" δεν μπορεί να το κάνει resolve.
Μένει να το ψάξω μήπως γίνεται να παίξει πάνω σε κάποιο event κατά το databinding. Αν έχει κάποιος καμιά άλλη ιδέα...
Vir prudens non contra ventum mingit