Recentemente mi è capitato di dover implementare una griglia contenente molti campi (colonne) in una applicazione Windows Forms (versione 2.0) del framework. Per ottimizzare lo spazio ho pensato a disegnare le label dell'header delle colonne in verticale.
Per raggiungere l'obiettivo vi sono principalmente due modalità: implementare l'evento CellPaiting oppure derivare una classe da DataGridViewColumnHeaderCell ed implementare l'evento Paint. Ho optato per la prima via (più veloce anche se meno portabile).
Quando viene sollevato l'evento si verifica se si tratta della cella di intestazione (indice di riga -1 e indice di colonna maggiore di 1) e quindi si procede al disegno del testo opportunamente formattato (attraverso StringFormat). E' importante ricordarsi di ridisegnare lo sfondo (PaintBackground) per non avere effetti indesiderati (effetto memoria) quando si ridimensiona la larghezza della colonna o l'altezza dell'intestazione.
Segue l'esempio di codice:
private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex == -1 && e.ColumnIndex > -1)
{
Rectangle r = e.CellBounds;
StringFormat sf = new StringFormat();
sf.Trimming = StringTrimming.EllipsisCharacter;
sf.FormatFlags |= StringFormatFlags.NoWrap;
sf.FormatFlags |= StringFormatFlags.DirectionVertical;
e.PaintBackground(e.ClipBounds, false);
e.Graphics.DrawString(
dataGridView.Columns[e.ColumnIndex].HeaderText,
e.CellStyle.Font,
Brushes.Black,
r,
sf);
e.Handled = true;
}else
e.Handled = false;
}