C# раскраска одинаковых значений в строке 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 red и так далее. Есть идеи, как мне лучше подойти к этой проблеме?
4 ответа
Я предлагаю использовать событие CellFormating.
Сначала получить объект, связанный с текущей строкой, используя 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;
}
}
Если после того, как вы добавили данные в сетку, вы можете перебирать строки / столбцы и программировать различные проверки, а затем просто присваивать задний цвет в зависимости от ситуации?
foreach(DatGridViewEow row in datagridview1.Rows)
{
for(int i=3;i<5;i++)
{
DataGridViewCell cell = row.cells[i];
cell.style.backcolor = Color.Red;
}
}
Не знаю, сработает ли это, если бы данные были из источника данных.
Хотел бы немного изменить ответ @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;
}
}
Все предложения помогли мне прийти к следующему решению, хотя Петр получит 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.