Вопрос

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

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

Частный Void PlayerGrid_CellStateChanged (отправитель объекта, datagridviewcellstatechangedeventargs e) {если (e.cstatechanged == dataGridViewElementStates.selected) e.cell.selection = false; }

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Я скорее нравится этот подход к тому, что я делаю. Он способен агностически изменять цвет фона (включая флажок) любого из клеток Datagridview с щелчком мыши или вкладки - например, например - выделить текущую выбранную ячейку. Я обнаружил, что другие подходы странно не окрасили фон флажка, поскольку другие типы клеток были окрашены. В моем примере я использую этот подход в событии Celleformatting, но я считаю, что аналогичный синтаксис может быть дублирован с успехом в другом месте. Кроме того, я считаю, что это более внимательно отвечает на вопрос ОПС, как это относится к конкретному событию 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;

         }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top