Цвет фона строки 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); } } 

Я думаю, лучшим местом было бы установить 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; } 

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

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

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

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 } } 

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

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

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

 timer1.Enabled=true 

и в событии timer_Tick:

 timer1.Enabled=false and all the code that doesn't work in constructor goes here... 

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

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

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

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

`