2012-09-20 11 views
8

Ho un problema interessante. Sto cercando di utilizzare un datatable come origine dati per un datagridview. Voglio colorare alcune celle del tavolo per indicare varie cose, ma per qualche motivo il colore non verrà visualizzato. Quindi il codice seguente mostra una cella non colorata.Impossibile cambiare il colore della cella del datagridview quando si utilizza un'origine dati

dataGridView1.DataSource = table; 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

posso solo ottenere un colore da visualizzare dopo il carico forma iniziale (ad esempio impostando un colore di cella sull'evento OnClick). Tuttavia, se creo in modo esplicito righe e colonne per la vista come nel codice sottostante, la colorazione funziona.

foreach (DataColumn col in table.Columns) 
    dataGridView1.Columns.Add(col.ColumnName, col.ColumnName); 

for (int i = 0; i < table.Rows.Count; i++) 
{ 
    var row = table.Rows[i]; 
    object[] values = new object[table.Columns.Count]; 
    for (int x = 0; x < table.Columns.Count; x++) 
     values[x] = row[x].ToString(); 

    dataGridView1.Rows.Add(values); 
} 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

Non voglio avere il codice in questo modo. Qualcuno sa cosa sta succedendo qui che mi impedisce di colorare le cellule?

+1

Non si mostra dove si sta tentando di colorare le celle - Immagino che sia all'interno del costruttore di moduli, dopo che è stato chiamato InitializeComponent(). La mia risposta è basata su questo. –

risposta

19

Se si tenta di impostare il colore della cella all'interno del costruttore del modulo che sarà colpire prima che i dati di legame è completato in modo che le modifiche alle cellule non si attacchino (non mi chiedere perché, semplicemente uno di quei trucchi con la DataGridView

la correzione più semplice per questo è di impostare i colori un po 'più tardi - di solito entro un gestore DataBindingComplete eventi:.

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 
} 

questo è appropriato per la colorazione statica del gr id: se si desidera che i colori cambino in base alle modifiche all'interno della griglia, utilizzare l'evento CellFormatting per modificare le celle.

+0

fantastico! grazie! mi ha aiutato così tanto – Novikoff

+0

Vedere anche https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/cell-styles-in-the-windows-forms-datagridview-control, vedere la sezione ' Impostazione degli stili dinamicamente'. – Wollmich

5

Questo è qualcosa che ho implementato di recente, non so se sarà d'aiuto ??

private void dgvOutstandingReports_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
      { 
       int colIndex = e.ColumnIndex; 
       int rowIndex = e.RowIndex; 


       if (rowIndex >= 0 && colIndex >= 0) 
       { 
        DataGridViewRow theRow = dgvOutstandingReports.Rows[rowIndex]; 


        if (theRow.Cells[colIndex].Value.ToString() == "Daily Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightYellow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Monthly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightGray; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "SMP Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Snow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Weekly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Pink; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Hourly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightSteelBlue; 
        } 
       } 
      } 
Problemi correlati