Цвет фона DataGridViewCheckboxCell

У меня есть DataGridView привязаны к списку объектов, и я устанавливаю динамический цвет фона ячейки, используя CellFormatting событие, как в этом ответе. Это хорошо работает для каждого столбца, кроме DataGridViewCheckboxColumn, Когда я щелкаю внутри этой ячейки (но за пределами флажка), фон ячейки меняется на белый по умолчанию.

Визуально это выглядит так, будто происходит отбор клеток, несмотря на все мои попытки остановить его. Мой код форматирования ячейки устанавливает SelectionBackColor так же хорошо как BackColor, Я отключил выбор ячеек, используя CellStateChanged событие, и ни один из других столбцов не может быть выбран:

private void PlayerGrid_CellStateChanged (отправитель объекта, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

Есть ли дополнительный обходной путь, чтобы переопределить поведение ячеек для флажков?

2 ответа

Решение

Я нашел обходной путь, добавив следующий код в CellStateChanged событие:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() вычисляет цвет фона ячейки на основе строки.)

Это устраняет проблему, но может вызвать проблемы с производительностью для больших или виртуальных таблиц, вызывая создание дополнительных объектов стиля.

Мне скорее нравится такой подход к тому, что я делаю. Он может независимо изменять цвет фона (включая флажок) ЛЮБОЙ из ячеек DataGridView щелчком мыши или вкладкой - например, для выделения выделенной в данный момент ячейки. Я обнаружил, что другие подходы, как ни странно, не окрашивали фон флажка, поскольку были окрашены другие типы ячеек. В моем примере я использую этот подход в событии CellFormatting, но я считаю, что подобный синтаксис может быть с успехом продублирован в другом месте. Кроме того, я полагаю, что это более точно отвечает на вопрос OP, поскольку он относится, в частности, к событию CellFormatting.

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
Другие вопросы по тегам