#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.