Цвет фона строки DataGridView не меняется

Я хочу изменить цвет фона строки DGV на основе определенного условия при загрузке даже в Windows Form. Но я не вижу никакого изменения цвета ни в одной строке DGV. Может ли кто-нибудь сказать мне, как я могу решить эту проблему?

private void frmSecondaryPumps_Load(object sender, EventArgs e)
{
            try
            {
                DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper());
                dataGridView1.DataSource = dt;

                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    foreach (DataGridViewColumn column in dataGridView1.Columns)
                    {
                        if (row.Cells[column.Name] != null)
                        {
                            if (row.Cells[column.Name].Value.ToString() == "ON")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Green;

                            if (row.Cells[column.Name].Value.ToString() == "OFF")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                        }
                    }
                }

                dataGridView1.Refresh();
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

Ответ 1

Я думаю, что лучшим местом было бы установить BackColor в событии CellFormatting DataGridView, что-то в этих строках.

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index
    // check the cell value under your specific column and then you can toggle your colors
    row.DefaultCellStyle.BackColor = Color.Green;
}

Ответ 2

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

Вероятно, самым простым решением этой проблемы является то, что ваш код должен заполнить/раскрасить ваши сетки в методе Shown() вашей формы вместо конструктора. Ниже приведена ссылка на сообщение в форумах msdn, которое опрокидывало меня на решение, оно помечено как ответ о 3/4 пути вниз по странице.

Сообщение форума MSDN с решением

Ответ 3

King_Rob верен. У меня была такая же проблема, поэтому я просто опубликую свою версию, так как другие предложения здесь далеки от оптимального.

Добавьте обработчики событий (в конструкторе или конструкторе):

this.Load += UserControl_Load; // or form or any control that is parent of the datagridview
dataGridView1.VisibleChanged += DataGridView1_VisibleChanged;

В методе обработчика события загрузки добавьте флаг

private bool _firstLoaded;
private void UserControl_Load(object sender, EventArgs e)
{
    _firstLoaded = true;
}

И, наконец, в методе обработчика видимого события:

private void DataGridView1_VisibleChanged(object sender, EventArgs e)
{
    if (_firstLoaded && dataGridView1.Visible)
    {
        _firstLoaded = false;
        // your code
    }
}

Ответ 4

Извините за поздний ответ, но сейчас я столкнулся с такой же проблемой.

У меня есть общее решение для вещей, которые не работают должным образом в конструкторе - используйте таймер

Установите его на некоторое короткое время, например, 100 мс. Затем в конструкторе у вас будет

timer1.Enabled=true

и в событии timer_Tick:

timer1.Enabled=false

and all the code that doesn't work in constructor goes here...

Он работал у меня каждый раз.

Ответ 5

Этот код является быстрым, легким и не требует памяти!

Используйте этот код, например, внутри события CellEndEdit

 `try{
 //your code
 }
 catch(Exception){
 //your exception
 }
finally{
yourDataGridView.Visible = false;
 yourDataGridView.Visible = true;
}

`