Цвет фона DataGridViewCheckboxCell - PullRequest
       9

Цвет фона DataGridViewCheckboxCell

3 голосов
/ 07 сентября 2010

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

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

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

Существует ли дополнительный обходной путь для изменения поведения ячеек для флажков?

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

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

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

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

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

0 голосов
/ 30 июня 2015

Мне скорее нравится такой подход к тому, что я делаю. Он может независимо изменять цвет фона (включая флажок) ЛЮБОЙ из ячеек 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;

         }
}
...