2013-07-16 10 views
5

voglio solo il colore di alcune intestazioni di riga di fondo per cambiare senza perdere il fresco finestre di default stili che vengono con DataGridView:colore di sfondo Change RowHeader sul DataGridView senza perdere stili predefiniti

Grid.EnableHeadersVisualStyles = false; 
for(int i=0; i<Grid.Rows.Count; i++) 
{ 
    if (/*I want to change this row */) 
    { 
     DataGridViewCellStyle rowStyle = Grid.RowHeadersDefaultCellStyle; 
     rowStyle.BackColor = Color.Wheat; 
     Grid.Rows[i].HeaderCell.Style = rowStyle; 
    } 
} 

Non appena faccio questo Perdo l'effetto blu MouseOver sulle colonne e la freccia di ordinamento sulle colonne è grigia. Ho provato a impostare le intestazioni delle colonne sul defaultColHeaderStyle senza alcun risultato. L'intestazione della riga cambia in base al colore desiderato, mentre le intestazioni delle colonne perdono il loro elegante stile Windows. Qualsiasi aiuto?

Grid.EnableHeadersVisualStyles = true

Grid.EnableHeadersVisualStyles = false

risposta

5

Lo stile di default per l'intestazione di riga dovrebbe già essere definiti quando si genera il DataGridView. Quindi mi sento di usare:

if (/*I want to change this row */) 
{ 
    DataGridViewCellStyle rowStyle; // = Grid.RowHeadersDefaultCellStyle; 
    rowStyle = Grid.Rows[i].HeaderCell.Style; 
    rowStyle.BackColor = Color.Wheat; 
    Grid.Rows[i].HeaderCell.Style = rowStyle; 
} 

In questo modo si riempie la vostra rowStyle con lo stile predefinito e quindi modificare solo la parte che si desidera modificare. Vedi se questo risolve il tuo problema.

// EDIT Come si desidera mantenere gli altri stili di Windows DataGridView predefinito, sarà inoltre necessario impostare altri parametri dello stile. Vedi this post.

Oppure prova questo. Quando initialiazing:

 dataGridView1.CellPainting += 
    new DataGridViewCellPaintingEventHandler (dataGridView_CellPainting); 

quindi creare la funzione di gestore con qualcosa di simile:

void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
    { 
     DataGridView dv = sender as DataGridView; 
     DataGridViewCellStyle rowStyle;// = dv.RowHeadersDefaultCellStyle; 

     if (e.ColumnIndex == -1) 
     { 
      e.PaintBackground(e.CellBounds, true); 
      e.Handled = true; 
      if (/*I want to change this row */) 
      { 
       rowStyle = dv.Rows[e.RowIndex].HeaderCell.Style; 
       rowStyle.BackColor = Color.Wheat; 
       dv.Rows[e.RowIndex].HeaderCell.Style = rowStyle; 
       using (Brush gridBrush = new SolidBrush(Color.Wheat)) 
       { 
        using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor)) 
        { 
         using (Pen gridLinePen = new Pen(gridBrush)) 
         { 
          // Clear cell 
          e.Graphics.FillRectangle(backColorBrush, e.CellBounds); 
          //Bottom line drawing 
          e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1); 

          // here you force paint of content 
          e.PaintContent(e.ClipBounds); 
          e.Handled = true; 
         } 
        } 
       } 
      } 
     } 
    } 

Questo codice è basato su this post. Si avrebbe solo allora necessario creare condizioni più vernice per mouseover e stato selezionato. Ma questo dovrebbe funzionare per te.

Ricordare di rimuovere: Grid.EnableHeadersVisualStyles = false; o forzarlo a: Grid.EnableHeadersVisualStyles = true;.

+0

Il problema è quando si gira Grid.EnableHeadersVisualStyles su false. Le intestazioni delle righe cambiano al colore, ma le intestazioni delle colonne sono piatte e non hanno l'aspetto di Grid.EnableHeadersVisualStyles su true. Ho provato la tua idea per le colonne (ottenendo e reimpostando lo stile) ma non funziona ... Pubblicherò foto di ciò di cui sto parlando – Tizz

+0

Capisco meglio di cosa stai parlando ora, con le immagini. Hmm. Questo potrebbe non essere possibile. – CaptainBli

+0

È possibile modificare una singola riga usando il gestore 'paint'. – CaptainBli