C # DataGridView BackColor не перезаписывается

У меня есть DataGridView в моей заявке на форму. После получения данных из таблицы в базе данных и отображения их в DataGridView я применяю зеленый цвет к BackColor некоторых ячеек строк, если выполняется определенное условие. После того, как эти ячейки становятся зелеными, программа заставляет их выполнить другое условие, которое окрашивает всю строку в BackColor красный цвет, если они не удовлетворяют условиям состояние.

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

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
    }
}

Прямо сейчас я окрашиваю эти предварительно окрашенные ячейки в красный одну за другой, но это требует много времени и кода, например:

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        //Trying to color the whole row RED, but not working
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
        //Manually color the cells, which are pre-colored to green, RED
        myDataGridView.Rows[i].Cells[6].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[7].Style.BackColor = Color.Red;
        ....
        myDataGridView.Rows[i].Cells[13].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[16].Style.BackColor = Color.Red;
    }
}

Мне интересно, есть ли лучший способ переопределить backColor. Может кто-нибудь помочь?

Вот пример (имитация) DataGridView.

Зеленые клетки не отменены Red Row

Те, кто не выполнили первое условие, автоматически получают красный цвет, и это работает. Однако, если они проходят первое условие и получают свою ячейку «Пройдено1» зеленым цветом, а затем не выполняют второе условие, как вы можете видеть, эти ячейки остаются зелеными. Я хочу покрасить всю строку в красный цвет, даже заменив предварительно окрашенную в зеленый цвет ячейкой на красный.


person Mika Jones    schedule 21.09.2017    source источник
comment
а) объясните «предварительно окрашенный»! б) см. здесь приведен пример раскраски ячеек в событии CellPainting. Если вы кодируете полный набор условий, этого должно быть достаточно.   -  person TaW    schedule 21.09.2017
comment
Если к ячейке был применен новый BackColor (то есть предварительно окрашенный), BackColor этой ячейки не может быть изменен на другой цвет, даже если я попытаюсь окрасить всю строку, включая эту ячейку, с помощью myDataGridView.Rows [i] .DefaultCellStyle.BackColor   -  person Mika Jones    schedule 21.09.2017
comment
В этом будет разница между значением по умолчанию и переопределенным значением. Используйте cell.BackColor, чтобы переопределить значение по умолчанию или предыдущее изменение! Также: попробуйте централизовать все раскраски и т. Д. В CellPainting ..   -  person TaW    schedule 21.09.2017
comment
На изображении, которое я прикрепил к своему сообщению, строки с ID: 2, 4 и 5 не могут быть полностью окрашены в красный цвет, а их ячейки Passed1 остаются зелеными.   -  person Mika Jones    schedule 21.09.2017
comment
Что ж, если вы просто измените цвет ячейки на зеленый, изменится только эта ячейка, а не вся строка. Прочтите Как задать вопрос и пройдите тур   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017
comment
@Plutonix Я знаю это. Мне просто интересно, почему применение изменения цвета ко всей строке не влияет на ту ячейку, которая уже имеет backColor. Думаю, мой плохой английский не имеет смысла ...   -  person Mika Jones    schedule 21.09.2017
comment
Прочтите Как задать вопрос и пройдите тур. У нас нет большого контекста, когда вы что-то делаете ... что важно в программировании, управляемом событиями. Я бы не стал зацикливать все строки для начала, потому что это неэффективно   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017


Ответы (2)


Цвета фона ячейки имеют приоритет при отрисовке ячейки. Начиная сверху, он будет каскадно перемещаться по списку, пока не будет установлен цвет *:

  1. Cell.Style.BackColor
  2. Row.DefaultCellStyle.BackColor
  3. DataGridView.AlternatingRowsDefaultCellStyle.BackColor
  4. DataGridView.RowsDefaultCellStyle.BackColor
  5. Column.DefaultCellStyle.BackColor
  6. DataGridView.DefaultCellStyle.BackColor

* Этот список не является обширным и может не включать все возможные доступные свойства BackColor.


Скорее всего, вы делаете что-то вроде установки Cell.Style.BackColor для ячеек в столбце Passed1, а затем логики кода, которую вы разместили. Это дает такие же результаты, как вы видите, потому что Green имеет более высокий приоритет, чем Red, где он установлен:

Зеленые клетки не отменены Red Row

Предполагая, что ваши условия для двух столбцов Passed являются двоичными (Yes или No), вы можете исправить это, «понизив» приоритет Green фона, установив Column.DefaultCellStyle.BackColor:

private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    this.dataGridView1.Columns["Passed1"].DefaultCellStyle.BackColor = Color.Green;
    this.dataGridView1.Columns["Passed2"].DefaultCellStyle.BackColor = Color.Green;

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        if (row.Cells["Passed1"].Value.ToString() == "No" || row.Cells["Passed2"].Value.ToString() == "No")
        {
            row.DefaultCellStyle.BackColor = Color.Red;
        }
    }
}

Что приводит к:

Зеленые клетки заменены красными рядами

person OhBeWise    schedule 21.09.2017
comment
Спасибо! Это именно тот ответ, которого я хотел. Я понятия не имел, что существует порядок приоритета. Это было причиной моей проблемы. Я рад, что вы правильно поняли мой вопрос. - person Mika Jones; 22.09.2017
comment
Честно говоря, я нигде не нашел списка этого порядка - даже при поиске документации MSDN. Я знаю только методом проб и ошибок. - person OhBeWise; 22.09.2017
comment
Я просто хотел еще раз поблагодарить вас. Я работаю над своим новым проектом, и у меня возникла очень похожая проблема, и я вернулся к этому порядку приоритета, и проблема сразу же устранилась. Спасибо Спасибо спасибо. - person Mika Jones; 18.10.2017
comment
Это потрясающе! Рад помочь. :) - person OhBeWise; 18.10.2017
comment
У @OhBeWise была аналогичная проблема, я лично считаю странным, что последняя версия не перезаписывает ее. - person A.bakker; 10.01.2020

Существует проблема с элементом управления datagridview, заключающаяся в том, что вы не можете изменить цвет любой из ячеек, пока ПОСЛЕ того, как форма не будет показана с помощью свойства DefaultCellStyle. Таким образом, запускаемые методы или события, запускаемые до вызова Shown (), не изменят цвет. Вероятно, в этом проблема. Возможно, вам придется создать метод рисования и вызвать его перед Shown ().

person Dimitris Baltas    schedule 21.09.2017