C # раскраска одинаковых значений в строке datagridview

#c#

#c# #datagridview #Цвет

Вопрос:

Допустим, у меня есть datagridview, заполненный строками. Теперь, чтобы сделать определенные данные более четкими, я хотел бы раскрасить фон определенных ячеек. Однако есть некоторые предостережения: количество столбцов, в которых я хочу раскрасить, может варьироваться. Чтобы сделать вещи более понятными, я набросаю поддельную сетку данных:

 Name Thing2 col1 col2 col3
tes   test   1    1     2
t2t   ers    3    3     3
der   zoef   2    3     1
 

Теперь ячейки col1-col3 должны быть окрашены в зависимости от их значения. Ячейки в первом столбце всегда будут зелеными (по соглашению), ячейки, отклоняющиеся от него, будут окрашены в красный цвет.
Итак, в первой строке col1 и col2 будут окрашены в зеленый цвет, а col3 — в красный и так далее.
Есть идеи, как мне лучше всего подойти к этой проблеме?

Комментарии:

1. Не могли бы вы быть более конкретными? 🙂 может быть, какое-нибудь крахмальное изображение того, как это должно выглядеть. Вы хотите раскрасить поля? например, любое поле с «1» — зеленым, любое поле с «2» — красным и т. Д.?

2. Теперь ячейки col1-col3 должны быть окрашены в зависимости от их значения. Ячейки в первом столбце всегда будут зелеными (по соглашению), ячейки, отклоняющиеся от него, будут окрашены в красный цвет. Итак, в первой строке col1 и col2 будут окрашены в зеленый цвет, а col3 — в красный и так далее. Есть идеи, как мне лучше всего подойти к этой проблеме?

3. в этом примере ячейками, нуждающимися в раскраске, являются col1-col2-col3. где col1 всегда зеленый, а остальные зависят от их отклонения от col1

Ответ №1:

Я предлагаю использовать событие форматирования ячеек.

Сначала получите объект, связанный с текущей строкой, используя e.RowIndex , а затем раскрасьте текущую ячейку в соответствии с текущим столбцом ( e.ColumnIndex ) и свойствами вашего объекта.

 private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.RowIndex >= customerBindingSource.Count)
                return;

            switch (e.ColumnIndex)
            {
                case 3:
                    Customer customer = (Customer)customerBindingSource[e.RowIndex];
                    if (customer.Salary > 1000)
                        e.CellStyle.BackColor = Color.Red;
                    break;
            }
        }
  

Ответ №2:

хотелось бы немного изменить ответ @Petr. Используя это, вы можете получить уникальный цвет для строк, даже если у вас тысячи строк. для каждого уникального значения их цвет связан с ним. просто нужно передать значение int, не превышающее 32 бит.

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                switch (e.ColumnIndex)
                {
                    case 3:
                        Customer customer = (Customer)customerBindingSource[e.RowIndex];
                        e.CellStyle.BackColor = Color.FromArgb(customer.Salary); // set unique color for each value
                        break;
                }            

            }
 

Ответ №3:

Если после того, как вы добавили данные в свой вид сетки, вы могли бы перебирать строки / столбцы и программировать различные проверки, а затем просто назначить backcolor соответствующим образом?

 foreach(DatGridViewEow row in datagridview1.Rows)
{
     for(int i=3;i<5;i  )
     {
          DataGridViewCell cell = row.cells[i];
          cell.style.backcolor = Color.Red;
     }
}
 

Не знаю, сработало бы это, если бы данные были из источника данных.

Ответ №4:

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

     /// <summary>
    /// Applies coloring to the result rows in the dataGrid
    /// </summary>
    private void ApplyColoring()
    {   
        if (dataGridView1.DataSource != null)
        {   
            // hardmap a color to a column
            IDictionary<Int32, Color> colorDictionary = new Dictionary<Int32, Color>();
            colorDictionary.Add(6, Color.FromArgb(194, 235, 211));
            colorDictionary.Add(7, Color.Salmon);
            colorDictionary.Add(8, Color.LightBlue);
            colorDictionary.Add(9, Color.LightYellow);
            colorDictionary.Add(10, Color.LightGreen);
            colorDictionary.Add(11, Color.LightCoral);
            colorDictionary.Add(12, Color.Blue);
            colorDictionary.Add(13, Color.Yellow);
            colorDictionary.Add(14, Color.Green);
            colorDictionary.Add(15, Color.White);

            IList<String> checkedValues = new List<String>();

            // first we loop through all the rows
            foreach (DataGridViewRow gridRow in dataGridView1.Rows)
            {
                IDictionary<String, Int32> checkedVal = new Dictionary<String, Int32>();

                // then we loop through all the data columns
                int maxCol = dnsList.Count   6;
                for (int columnLoop = 6; columnLoop < maxCol; columnLoop  )
                {
                    gridRow.Cells[columnLoop].Style.BackColor = Color.FromArgb(194, 235, 211);
                    string current = gridRow.Cells[columnLoop].Value.ToString();

                    for (int checkLoop = 6; checkLoop < maxCol; checkLoop  )
                    {
                        string check = gridRow.Cells[checkLoop].Value.ToString();

                        if (!current.Equals(check))
                        {
                            if (checkedVal.Keys.Contains(current))
                            {
                                gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[checkedVal[current]];
                            }
                            else
                            {
                                gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[columnLoop];
                                checkedVal.Add(current, columnLoop);
                            }
                        }
                    }
                }
            }
        }
    }
 

РЕДАКТИРОВАТЬ: 20 января словарь с цветами сопоставляется с (возможными) столбцами, которые могут быть окрашены. В случае моего приложения мы никогда не получим более 10 столбцов, но вы можете легко заставить их начать все сначала, используя операцию MOD или w / e.