Цвет не применяется к строке просмотра данных, если он не имеет фокуса - PullRequest
0 голосов
/ 22 декабря 2010

Я создаю форму журнала и отображаю информацию в DGV. Каждый журнал представлен в виде класса LogEntry.

Первоначально я создал и добавил данные в DGV следующим образом:

Создание каждого столбца DGV следующим образом:

DataGridViewTextBoxColumn dateTimeColumn = new DataGridViewTextBoxColumn();
dateTimeColumn.Name = "dateTime";
dateTimeColumn.HeaderText = "Date/Time";
dataGridView_Log.Columns.Add(dateTimeColumn);

Добавление записи logEntry:

dataGridView_Log.Rows.Add(logEntry.dateTime, logEntry.service, logEntry.command, logEntry.message);
dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color;

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

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

Добавление столбцов:

    //Create a new DataTable
    dt = new DataTable("Logs");

    //Add columns to datatable
    dt.Columns.Add("dateTime", typeof(string));
    dt.Columns.Add("Service", typeof(string));
    dt.Columns.Add("Command", typeof(string));
    dt.Columns.Add("Message", typeof(string));

    //Set the dataGridView's dataSoure to the filled dataTable
    dataGridView_Log.DataSource = dt;

Добавление строк:

  row = dt.NewRow();

  row["dateTime"] = logEntry.dateTime;
  row["Service"] = logEntry.service;
  row["Command"] = logEntry.command;
  row["Message"] = logEntry.message;

  dt.Rows.Add(row);

   dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color;

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

Еще одна заметка отфильтрована, я хочу, чтобы цвет по-прежнему применялся к правильным строкам.

Все, что я хочу, это блестящие цвета:)

Спасибо за ваше время и помощь.

Ответы [ 3 ]

1 голос
/ 06 июля 2012

У меня была похожая проблема.

My DataGridView DataSource - это список объектов, где многие объекты могут иметь одинаковое значение в свойстве «Блок». Я пытался применить цвета на основе "Блок".

Я решил проблему, используя список, содержащий цвет для каждого значения свойства:

Свойство для сохранения цветов:

private Dictionary<Block, Color> m_BlockColors = new Dictionary<Block, Color>();

Код:

DataGridViewCell blockCell = null;
if (dataGridView.Columns.Contains(columnNameBlock))
{
    blockCell = dataGridView[columnNameBlock, e.RowIndex];
}
if (blockCell != null)
{
    if (blockCell.Value == null)
    {
        e.CellStyle.BackColor = Color.Red;
    }
    else
    {
        Block blockOfCurrentRow = (Block)blockCell.Value;
        Block blockOfRowBefore = null;

        // Wont hit at first Row!
        if (e.RowIndex > 0)
        {
            blockOfRowBefore = (Block)dataGridView[columnNameBlock, e.RowIndex - 1].Value;
        }

        if (blockOfRowBefore != null)
        {
            //Trace.WriteLine("------------------------------------------------------");
            //Trace.WriteLine(String.Format("RowIndex: {0}", e.RowIndex));
            //Trace.WriteLine(String.Format("ColumnIndex: {0}", e.ColumnIndex));
            //Trace.WriteLine(String.Format("Current Block: {0}", blockOfCurrentRow.BlockNummer));
            //Trace.WriteLine(String.Format("Prev Block: {0}", blockOfRowBefore.BlockNummer));

            if (blockOfCurrentRow == blockOfRowBefore)
            {
                e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
            }
            else
            {
                // Previous Row was gray:
                if (m_BlockColors[blockOfRowBefore] == Color.LightGray)
                {
                    if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
                    {
                        m_BlockColors.Add(blockOfCurrentRow, Color.White);
                    }
                }
                // Previous Row was white:
                else
                {
                    if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
                    {
                        m_BlockColors.Add(blockOfCurrentRow, Color.LightGray);
                    }
                }
                e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
            }
        }
        else
        {
            // first Row
            if (!m_BlockColors.ContainsKey(blockOfCurrentRow))
            {
                m_BlockColors.Add(blockOfCurrentRow, Color.White);
            }
            e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow];
        }
    }
}
0 голосов
/ 22 декабря 2010

Я думаю, что я решил это ...

я добавил (при создании таблицы данных):

dt.Columns.Add("Color", typeof(Color));

затем после присвоения источника данных

dataGridView_Log.Columns["Color"].Visible = false;

заполнение каждой строки:

row["Color"] = logEntry.color;

добавлено событие форматирования ячейки:

    private void dataGridView_Log_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        dataGridView_Log.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (Color)dataGridView_Log.Rows[e.RowIndex].Cells["Color"].Value;
    }

Работает с фильтрацией aswell:)

0 голосов
/ 22 декабря 2010

Я не уверен, почему цвета не обновляются, пока вы не выберете что-то в сетке.Вы пытались позвонить .Refresh() или .Update() после установки цветов?

Интересное прочтение о стилях DataGridView находится по этой ссылке в MSDN:

http://msdn.microsoft.com/en-us/library/1yef90x0.aspx

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