Search code examples
c#winformsdatagridviewpaintevent

Selection in DataGridView does not work after CellPaintEvent


I have a Datagridview. I need to use a CellPainting Event to customize the appereance of my DataGridview. I used the code of the msd documentation:

MSD Documentation

Evrything works perfect, i was able to customize my Datagridview like i needed to. But the only thing that is not working anymore ist the selection of a Row: Cells where the paintevent has done its job are excluded from the selection. It looks like this:

How it looks

Does anyone know waht i have to do that the selection works normal again?

Edit: i also tried to reapplay the Cellstyle with "ApplyStyle" Doest not work.

Edit2: Here the Code from MSD. Applying it will result that the selection won't work properly.

private void dataGridView1_CellPainting(object sender,
System.Windows.Forms.DataGridViewCellPaintingEventArgs e)
{
    if (this.dataGridView1.Columns["ContactName"].Index ==
        e.ColumnIndex && e.RowIndex >= 0)
    {
        Rectangle newRect = new Rectangle(e.CellBounds.X + 1,
            e.CellBounds.Y + 1, e.CellBounds.Width - 4,
            e.CellBounds.Height - 4);

        using (
            Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
            backColorBrush = new SolidBrush(e.CellStyle.BackColor))
        {
            using (Pen gridLinePen = new Pen(gridBrush))
            {
                // Erase the cell.
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                // Draw the grid lines (only the right and bottom lines;
                // DataGridView takes care of the others).
                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                    e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
                    e.CellBounds.Bottom - 1);
                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                    e.CellBounds.Top, e.CellBounds.Right - 1,
                    e.CellBounds.Bottom);

                // Draw the inset highlight box.
                e.Graphics.DrawRectangle(Pens.Blue, newRect);

                // Draw the text content of the cell, ignoring alignment.
                if (e.Value != null)
                {
                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                        Brushes.Crimson, e.CellBounds.X + 2,
                        e.CellBounds.Y + 2, StringFormat.GenericDefault);
                }
                e.Handled = true;
            }
        }
    }
}

Solution

  • from dr.null i built the following code:

    // checks if cell is selected. if so, paint the background with the selectionbackgroundcolor. 
    if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected)
    {
       var selectedbrush = new SolidBrush(e.CellStyle.SelectionBackColor);
       e.Graphics.FillRectangle(selectedbrush, e.CellBounds);
    }
    

    this code has the be in the CellPaintingEvent.

    :

    now it looks like this