Ας κάνουμε λίγο refactoring
Private Sub Dg0_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Dg0.CellValueChanged
Try
If e.ColumnIndex > 1 Then
Dim cell As DataGridViewCell = Dg0.Item(e.ColumnIndex, e.RowIndex)
If cell.Value IsNot Nothing Then
cell.Style.BackColor = GetBackColor(cell)
cell.Style.ForeColor = GetForeColor(cell)
Fs0.sh1.Cells(e.RowIndex + 2, e.ColumnIndex + 1).Value = CType(DgvCell.Value, String)
End If
End If
Catch
End Try
End Sub
Private Function GetBackColor(ByVal DgvCell As DataGridViewCell) As Color
Return Color.FromName(CType(DgvCell.Value, String))
End Function
Private Function GetForeColor(ByVal DgvCell As DataGridViewCell) As Color
If Color.FromName(CType(DgvCell.Value, String)).GetBrightness() >= 0.5 Then
Return Color.Black
Else
Return Color.White
End If
End Function
Ti κερδίζουμε με το παραπάνω:
- Πιο ευανάγνωστος κώδικας
- Ταχύτερος κώδικας. Κάθε φορά που λέμε Dg0.Item(e.ColumnIndex, e.RowIndex) κάνουμε αναζήτηση μέσα σε όλα τα κελιά για να βρούμε αυτό που θέλουμε να δουλέψουμε, πράγμα που μπορούμε να αποφύγουμε αποκτώντας μία φορά ένα reference στο κελί και χρησιμοποιώντας αυτό σε όλες τις υπόλοιπες περιπτώσεις.
Επίσης, συνήθησε να γράφεις κώδικα βάζοντας στην πρώτη γραμμή το "Option Strict On". Αν το είχες κάνει αυτό θα σου χτύπαγε το:
Dim str As String = Dg0.Item(e.ColumnIndex, e.RowIndex).Value
καθώς κάνει implicit μετατροπή από object σε string. Καλό είναι να αποφεύγεις τις implicit μετατροπές.
Γενικά, ο κώδικας χρειάζεται διάφορα Try...Catch. Πχ, το
CType(DgvCell.Value, String)
είναι σίγουρο ότι θα γίνεται πάντα; Και αν τελικά γίνεται το CType, το string που θα επιστρέφει, θα είναι πάντοτε valid χρώμα ώστε να μην βγαίνει exception με το Color.FromName(CType(DgvCell.Value, String));
Vir prudens non contra ventum mingit