DataGridView leggere colore sfondo cella

di il
13 risposte

DataGridView leggere colore sfondo cella

Un saluto a tutto il forum, in un datagridview in base al valore di una cella, cambio il colore da bianco a cyan,
la mia difficoltà è quella che al ripetersi del valore se la cella è già cyan, dovrebbe colorarla in green.
Questo è il codice base iniziale che ho:
For ii As Long = 0 To DataGridView4.Rows.Count() - 1
For t = 0 To 5
If DataGridView4.Rows(ii).Cells(t).Value = ds Then
Me.DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
End If
Next t
Next ii
Questa è la modifica che ho fatto ma non funziona:
For ii As Long = 0 To DataGridView4.Rows.Count() - 1
For t = 0 To 5
If DataGridView4.Rows(ii).Cells(t).Value = ds And Me.DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan Then
Me.DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Green
End If
Next t
Next ii
Ringrazio chi può darmi le indicazioni per risolvere.
Francesco

13 Risposte

  • Re: DataGridView leggere colore sfondo cella

    
    se Value = ds allora
        se BackColor = cyan allora
            BackColor = verde
        altrimenti
          BackColor = cyan
       fine se
    fine se          
    
  • Re: DataGridView leggere colore sfondo cella

    Grazie per la risposta ma non mi risolve il problema perchè non riesco a rilevare il colore con il seguente codice:
    DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
    Francesco
  • Re: DataGridView leggere colore sfondo cella

    Il confronto fra colori è sempre un problema, dato che non è una variabile primitiva ma un oggetto, per cui dovresti prima convertire il colore in variabile primitiva, ad esempio un integer, però mantenendo solo RGB e non anche il canale alfa che può dare problemi.
    Per cui prima di tutto ti calcoli il colore Cyan:
    Dim ColorCyan = (Color.Cyan.ToArgb And &HFFFFFF)
    E poi il confronto lo fai così:
    DataGridView4.Rows(ii).Cells(t).Style.BackColor.ToArgb And &HFFFFFF = ColorCyan
  • Re: DataGridView leggere colore sfondo cella

    Francesco53 ha scritto:


    Grazie per la risposta ma non mi risolve il problema perchè non riesco a rilevare il colore con il seguente codice:
    DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
    Francesco
    per rilevare il colore:
    
    ' tutto l'oggetto
    Dim cColore As Color = DataGridView4.Rows(ii).Cells(t).Style.BackColor
    ' solo la proprietà nome dell'oggetto Color
    Dim sColore As String = DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name
    
    la variabile sColore conterrà tutte le proprietà dalle quali puoi estrarre l'informazione che ti interessa, ARGB, A, R, G, B, Name, IsKnowColor e IsNamedColor
    la variabile cColore contiene il nome del colore se conosciuto, altrimenti viene mostrata una stringa con i valori esadecimali di ARGB.

    Il colore lo hai inserito tu, il confronto con la stringa "Cyan" è sufficiente
    
    If DataGridView4.Rows(ii).Cells(t).Value = ds And Me.DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name = "Cyan" Then
    Me.DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Green
    
    Il codice qui sopra non ti farà diventare la cella Cyan, la prima volta che il valore ds corrisponde.
    Rileggi il post di grumpy:

    grumpy ha scritto:


    
    se Value = ds allora
        se BackColor = cyan allora
            BackColor = verde
        altrimenti
          BackColor = cyan
       fine se
    fine se          
    
  • Re: DataGridView leggere colore sfondo cella

    C'è però da osservare che il metodo di esaminare il valore di tutte le celle della griglia non è efficiente. E non si capisce neanche quando questa analisi viene eseguita: al momento del caricamento iniziale ? Ogni volta che cambia il contenuto di una cella ? Il fatto che i possibili colori siano tre (bianco, cyan, verde) fa pensare che i valori delle celle possano variare durante l'esecuzione del programma, altrimenti, in fase di caricamento iniziale, non si potrebbe incontrare una cella già cyan.
    La soluzione corretta è quella di usare l'evento CellFormatting, che è stato inventato per questo.
  • Re: DataGridView leggere colore sfondo cella

    Io non farei affidamento sul colore già assegnato alla cella, ma implementerei una logica tale per cui, avendo a disposizione gli oggetti o i record su cui lavorare, si determina per ciascuno di essi il colore *finale* e *definitivo*, ovvero quello giusto tutto considerato, e andrei poi di conseguenza a prelevare dalla struttura dati dei colori quello corretto, cella per cella, quando è necessario inizializzarla o disegnarla.

    Ciao! :bye:
  • Re: DataGridView leggere colore sfondo cella

    Un saluto ed un ringraziamento per i vostri consigli che ho utilizzato per la risoluzione della mia difficoltà.
    Posto il codice con la variazione in base alle vostre indicazioni:
    Sub Evidenzia()
            Dim ds As Byte = TextBox1.Text
            For ii As Long = 0 To DataGridView4.Rows.Count() - 1
                For t = 0 To 5
                    Dim sColore As String = DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name
                    If DataGridView4.Rows(ii).Cells(t).Value = ds Then
                        DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
                    End If
                    If DataGridView4.Rows(ii).Cells(t).Value = ds And DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name = sColore Then
                        DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Green
                    End If
                Next t
            Next ii
        End Sub
    Francesco
  • Re: DataGridView leggere colore sfondo cella

    Non è una soluzione molto bella. Questa Sub Evidenzia, in quale circostanza la richiami?
  • Re: DataGridView leggere colore sfondo cella

    Ciao viene richiamata da un Button dopo aver inserito dei dati in textbox ed in particolare nella textbox1.text.
    Francesco
  • Re: DataGridView leggere colore sfondo cella

    Quindi mi pare di capire che, nel corso dell'esecuzione del programma, i contenuti della griglia possono cambiare e bisogna cliccare il Button per aggiornare il colore delle celle, cioè fare un refresh. Se è così (ma non ne sono certo) non sarebbe meglio che al cambiare del valore delle celle cambiasse automaticamente il colore senza bisogno di cliccare alcun button?
  • Re: DataGridView leggere colore sfondo cella

    Grumpy, ho cercato di semplificare la risposta, uso TextBox_KeyDown per eseguire il codice.
  • Re: DataGridView leggere colore sfondo cella

    Francesco53 ha scritto:


    Un saluto ed un ringraziamento per i vostri consigli che ho utilizzato per la risoluzione della mia difficoltà.
    Posto il codice con la variazione in base alle vostre indicazioni:
    Sub Evidenzia()
            Dim ds As Byte = TextBox1.Text
            For ii As Long = 0 To DataGridView4.Rows.Count() - 1
                For t = 0 To 5
                    Dim sColore As String = DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name
                    If DataGridView4.Rows(ii).Cells(t).Value = ds Then
                        DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
                    End If
                    If DataGridView4.Rows(ii).Cells(t).Value = ds And DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name = sColore Then
                        DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Green
                    End If
                Next t
            Next ii
        End Sub
    Francesco
    Si può ottimizzare.
    Estrai inutilmente il colore di fondo di tutte le celle.
    Se il valore è ds, tu metti a ciano, poi ricontrolli inutilmente ds e giustamente BackColor, se sColore non era ciano lasci ciano.
    se lo sfondo della cella è già ciano e il valore è ds, tu metti inutilmente a ciano, poi ricontrolli inutilmente ds e giustamente BackColor, e visto che sColore era ciano, metti lo sfondo a verde.
    se lo sfondo della cella è verde, torna a ciano... non è sbagliato?
    
    Sub Evidenzia()
            Dim ds As Byte = TextBox1.Text
            For ii As Long = 0 To DataGridView4.Rows.Count() - 1
                For t = 0 To 5
                        If DataGridView4.Rows(ii).Cells(t).Value = ds Then
                            Select Case DataGridView4.Rows(ii).Cells(t).Style.BackColor.Name
                                Case "0" ' colore di default, se lo hai cambiato in White metti "White" 
                                    DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Cyan
                                Case "Cyan"
                                    DataGridView4.Rows(ii).Cells(t).Style.BackColor = Color.Green
                            End Select
                        End If
                Next t
            Next ii
    End Sub
    In questo modo controlli il valore ds una sola volta per cella e solo quando corrisponde controlli anche il colore una sola volta e se è quello di default "0" [ARGB(0,0,0,0) = nero max trasparenza], lo cambi in ciano una sola volta, se è ciano lo cambi in verde.
    Se la cella è verde resta verde.

    Se le celle sono poche, la differenza di velocità non si vedrà, ma se le celle sono molte la differenza si vedrà.

    Se le celle sono moltissime, rileggi il post di Alka

    Alka ha scritto:


    Io non farei affidamento sul colore già assegnato alla cella, ma implementerei una logica tale per cui, avendo a disposizione gli oggetti o i record su cui lavorare, si determina per ciascuno di essi il colore *finale* e *definitivo*, ovvero quello giusto tutto considerato, e andrei poi di conseguenza a prelevare dalla struttura dati dei colori quello corretto, cella per cella, quando è necessario inizializzarla o disegnarla.

    Ciao! :bye:
    perché leggere e scrivere i valori sui controlli grafici è lento, inoltre inizializzare le celle tutte dello stesso colore per poi riscrivere i colori, allunga il processo.
  • Re: DataGridView leggere colore sfondo cella

    Ciao Rubik ti ringrazio per le tue indicazioni, vista l'esiguità delle celle, sono solo 24, la lentezza è irrilevante.
    Costruisco le 24 celle Backcolor white e alla scelta di una determinata voce mi colora di Cyano, se questa richiesta
    dovesse essere ripetuta, mi avvisa colorando di verde la cella.
    Comunque vedrò di migliorare il codice in base ai tuoi consigli.
    Grazie,
    Francesco
Devi accedere o registrarti per scrivere nel forum
13 risposte