Eigene Textformatierungen und Bitmaps im ListView darstellen (OwnerDraw)

ListView1.OwnerDraw = true;
ListView1.View = View.Details;

// ListView-Überschriften zeichnen
private void ListView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    e.DrawBackground();

    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;

    // da StringAlignment.Center, muss die Breite für die Darstellung durch 2 geteilt werden
    int iWidth = ListView1.Columns[e.ColumnIndex].Width / 2;
    
    // Header-String zentriert, schwarz und fett zeichnen
    e.Graphics.DrawString(e.Header.Text, new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold), Brushes.Black, e.Bounds.X + iWidth, e.Bounds.Y, sf);
}

// ListView-Subitems zeichnen
private void ListView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;

    switch (e.ColumnIndex)
    {
        case 0:
            // Subitem 0 beinhaltet ein Bitmap
            Bitmap b = new Bitmap(@"c:\temp\test.jpg");
            e.Graphics.DrawImage(b, e.Bounds.X, e.Bounds.Y);
            break;
        default:
            // für alle anderen SubItems
            // halbe Spaltenbreite der akt. Spalte ausrechnen
            int iWidth = ListView1.Columns[e.ColumnIndex].Width / 2;
            // halbe Zellenhöhe ausrechnen
            int iHeight = (int)(ListView1.Font.SizeInPoints / 2.0);
            // String mit akt. Subitem-Text zeichnen
            e.Graphics.DrawString(e.SubItem.Text, new Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular), Brushes.Black, e.Bounds.X + iWidth, e.Bounds.Y + iHeight, sf);
            break;
    }
}

// ListView-Item Hintergrund speziell färben, wenn focusiert
private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    if (e.State == ListViewItemStates.Focused)
    {
        e.Graphics.FillRectangle(Brushes.Beige, e.Bounds);
        e.DrawFocusRectangle();
    }
}