DataGridView: по-разному выделять ячейку и строку - PullRequest
0 голосов
/ 02 сентября 2018

Как по-разному выделить строку и текущую ячейку в сетке данных? У меня SelectionMode установлено на CellSelect и MultiSelect установлено на False.

Я хочу, чтобы вся строка была выделена, а выбранная ячейка была выделена другим цветом. В основном как то так: enter image description here

Я пытаюсь использовать событие CellEnter для этого с кодом:

dgvResult.SelectedRows[0].DefaultCellStyle.SelectionBackColor = Color.LightBlue;
dgvResult.SelectedCells[0].Style.SelectionBackColor = Color.Blue;
dgvResult.Refresh();

К сожалению, первая строка работает только тогда, когда Selection Mode установлен на FullRowSelect, а вторая строка работает только на CellSelect.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 02 сентября 2018

Это немного сложнее, чем можно надеяться.

Вам нужно либо отслеживать цвета, которые вы устанавливаете для ячеек, либо сбрасывать все каждый раз. Последний более надежный ИМО.

DGV находится в DataGridViewSelectionMode.FullRowSelect.

Примечание. Сброс DefaultCellStyle Color можно установить, установив Color.Empty.

Пример:

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0) return;

    foreach ( DataGridViewRow row in dataGridView1.SelectedRows)
       row.DefaultCellStyle.SelectionBackColor = Color.Empty;
    foreach ( DataGridViewCell cell in dataGridView1.SelectedCells)
       cell.Style.SelectionBackColor = Color.Empty;
    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.RosyBrown;
    dataGridView1[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Color.LightSeaGreen;
}

Другие события также должны работать ..

Upddate:

Как отметил Джими, вместо сброса перед установкой в ​​том же событии щелчка можно использовать событие CellLeave в паре с событием CellEnter, чтобы сделать то же самое. Кажется, работает нормально из моих тестов:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.RosyBrown;
    dataGridView1[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Color.LightSeaGreen;
}

private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.Empty;
    dataGridView1[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Color.Empty;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...