Цвет фона строки DataGridView не меняется - PullRequest
13 голосов
/ 02 марта 2012

Я хочу изменить цвет фона строки 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);
            }
        }

Ответы [ 5 ]

12 голосов
/ 01 февраля 2013

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

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

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

12 голосов
/ 02 марта 2012

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

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
    }
}
1 голос
/ 04 августа 2015

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

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

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

timer1.Enabled=true

, а в событии timer_Tick:

timer1.Enabled=false

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

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

0 голосов
/ 28 апреля 2017

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

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

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

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...