Cambiare colore ad un DataGridViewRow

martedì 02 dicembre 2008 - 15.40

Teech Profilo | Expert

Ho un DataGridView popolato a runtime con alcune righe/colonne attraverso un BindingSource.
Il DataSource del BindingSource è una collection di miei oggetti.

Ora, vorrei cambiare il colore di sfondo di ogni singola DataGridViewRow in base al valore di una proprietà dei miei oggetti
Ad esempio, nella collection ho una lista di Clienti e per ognuno di essi ho le proprietà Codice, RagioneSociale, Fatturato; vorrei che nel DataGridView venissero visualizzate le colonne Codice e RagioneSociale, mentre per il Fatturato, vorrei implementare un modo che se il fatturato è >1000 la riga venga con uno sfondo rosso...

Sono riuscito a farlo in diversi modi ma nessuno che sia compatibile con altre prerogative della griglia; ad esempio, quando ordino le righe, si spostano i dati ma non i colori -rimangono colorate le stesse righe anche se cambia il contenuto- (mettendo il codice sull'evento DataSourceChanged). Altro esempio, sono riuscito a farlo ma l'ulima riga non viene ciclata (mettendo il codice sull'evento RowsAdded).
Sembra quasi che il colore di sfondo venga assegnato all'indice della riga e non alla riga stessa (non so se mi spiego)...

Il codice che uso (e NON so se è corretto) è il seguente:
If CType(bs.Item(e.RowIndex), Cliente).Fatturato > 1000 Then dgvClienti.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red End If
Potete aiutarmi?

Grazie
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

Ciao,
io per fare queste funzionalità usavo l'evento "RowPrePaint", ossia quando devo visualizzare quella riga (evento Paint invocato da Windows stesso) la griglia decideva che colore usare in base a dei valori della griglia stessa.

Tradotto in codice, un esempio:
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { Ordine ord = dataGridView1.Rows[e.RowIndex].DataBoundItem as Ordine; if (ord != null && ord.Articoli > 30) dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = ... }

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

alexmed Profilo | Guru

Ciao, sempre io

Questo è il codice completo che usavo per evidenziare le date maggiori di oggi nella mia DGV

Private Sub ViewOPERAZIONIDataGridView_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles ViewOPERAZIONIDataGridView.CellFormatting

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Fammi sapere!!
Ciao

Teech Profilo | Expert

Le vorrei accettare entrambe perchè entrambe funzionano...
L'unico appunto è che per farle funzionare anche dopo un ordinamento è necessario riportare le righe al colore di origine se precedentemente variate (io ho fatto come di seguito riportato):
If CType(dgv.Rows(e.RowIndex).DataBoundItem, IOggetto).Proprietà > 0 Then dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red Else dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Empty End If
Funziona che è una meraviglia... Grazie mille ad entrambi!!!

P.S.: Ho usato l'evento RowPrePaint solo per il fato che nel CellSFormatting metterò la formattazione dei dati (formati date, decimali sui valori, ecc...) ed il codice viene più pulito.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5