Как изменить цвет фона одной ячейки в windows.forms.datagrid?

Я отчаянно пытаюсь понять, как изменить цвет фона одной ячейки в winforms dataGridView. У меня есть два столбца: если я изменю содержимое во втором столбце, я хочу, чтобы ячейка в первом столбце этой строки соответственно изменила фон.

    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex != 0 || e.RowIndex == -1)
            return;
        if (dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString() == "Red")
            e.CellStyle.BackColor = Color.Red;
        else
            e.CellStyle.BackColor = Color.White;
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex != 1 || e.RowIndex == -1)
            return;
        // dataGridView1.Rows[e.RowIndex].Cells[0]. ???
    }

Первый обработчик событий устанавливает backColor ячеек в первом столбце, если они окрашены. Второй обработчик событий должен сообщить первой ячейке, что нужно рисовать, если значение изменилось. Если я изменю ширину столбца, он закрасит правильный цвет, поэтому первый обработчик сделает всю работу. Но как запустить рисование ячеек?

Спасибо за помощь.


person Martin Booka Weser    schedule 10.12.2010    source источник


Ответы (4)


Я бы подумал, что редактирование вызовет перерисовку, но если это событие не запускается после редактирования, вы должны иметь возможность вызвать проблему с чем-то вроде:

dataGridView1.InvalidateCell(e.RowIndex, 1);
person Alex B    schedule 10.12.2010
comment
именно это я и искал. спасибо - person Martin Booka Weser; 13.12.2010

Хорошо, вот плохой хак:

если я вставлю

var x = dataGridView1.Columns[0].DefaultCellStyle;
dataGridView1.Columns[0].DefaultCellStyle = null;
dataGridView1.Columns[0].DefaultCellStyle = x;

в обработчике события CellValueChanged перерисовывается весь первый столбец. Так что моя клетка тоже перекрашена. Но это не грязно, не так ли?

person Martin Booka Weser    schedule 10.12.2010

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

частный DataGridViewCellStyle CellStyleGreenBackgnd;

CellStyleGreenBackgnd.BackColor = Color.LightGreen;

dataGridView.CurrentCell.Style.ApplyStyle(CellStyleGreenBackgnd);

person skinnedKnuckles    schedule 10.12.2010

Попробуй это.

dataGridView1.Rows[indexhere].Cells[indexhere].Style.ForeColor = Color.Yellow;
person Community    schedule 09.06.2017