Строка DataGridView: полупрозрачный выбор или граница строки при выделении - PullRequest
11 голосов
/ 15 декабря 2010

У меня есть DataGridView, где фон каждой строки отличается в зависимости от элемента привязки данных. Однако, когда я выбираю строку, я больше не вижу ее исходного цвета фона.

Чтобы решить эту проблему, я подумал о двух решениях:

Я могу сделать выделение полупрозрачным, что позволяет увидеть, имеют ли две выбранные строки разные цвета фона.

Или; Я могу полностью удалить выделенные цвета и нарисовать границу вокруг выбранных строк.

Какой вариант проще и как я могу это сделать?

Это приложение WinForm.

Редактировать: в итоге я использовал ваш код, по течению

    private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        if (dgv.Rows[e.RowIndex].Selected)
        {
            var row = dgv.Rows[e.RowIndex];
            var bgColor = row.DefaultCellStyle.BackColor;
            row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(bgColor.R * 5 / 6, bgColor.G * 5 / 6, bgColor.B * 5 / 6);
        }
    }

Это создает впечатление полупрозрачного выделения цвета. Спасибо за вашу помощь!

1 Ответ

9 голосов
/ 15 декабря 2010

Если вы хотите нарисовать границу вокруг выбранных строк, вы можете использовать DataGridView.RowPostPaintEvent , а для «очистки» выделенных цветов вы можете использовать DataGridViewCellStyle.SelectionBackColor и DataGridViewCellStyle.SelectionForeColor properties.

Например, если я установлю стиль ячейки строки следующим образом

row.DefaultCellStyle.BackColor = Color.LightBlue;
row.DefaultCellStyle.SelectionBackColor = Color.LightBlue;
row.DefaultCellStyle.SelectionForeColor = dataGridView1.ForeColor;

, я могу добавить этот код в RowPostPaintEvent

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    if (dataGridView1.Rows[e.RowIndex].Selected)
    {
        using (Pen pen = new Pen(Color.Red))
        {
            int penWidth = 2;

            pen.Width = penWidth;

            int x = e.RowBounds.Left + (penWidth / 2);
            int y = e.RowBounds.Top + (penWidth / 2);
            int width = e.RowBounds.Width - penWidth;
            int height = e.RowBounds.Height - penWidth;

            e.Graphics.DrawRectangle(pen, x, y, width, height);
        }
    }
}

и выбранная строка будет отображаться так:

row with border

...