У меня есть DGV, который имеет некоторое условное форматирование для значений во всех столбцах, кроме первых N столбцов (столбцы элементов). Первые N столбцов (столбцы категории) имеют ссылочные значения для остальной части таблицы. Примерно так:
Category1 Category2 Item1 Item2 Item3 Item4
1 2 1 2 1 2
56 57 57 56 56 56
У меня также есть словарь, который устанавливает соответствие заголовков всех столбцов заголовкам ссылочных столбцов.
{Item1, Category1}
{Item2, Category1}
{Item3, Category1}
{Item4, Category2}
Каждая ячейка для Items1-4 сравнивается с соответствующей категорией (используя словарь) в обработчике событий CellFormatting. Затем, если это совпадение, она окрашивает ячейку в зеленый цвет, в противном случае - в красный.
Другими словами, в обработчике события CellFormatting я использую словарь, чтобы проверить, какие значения должен иметь конкретный столбец из столбцов ссылок N.
Теперь у меня есть совершенно отдельный элемент управления (еще один DGV с выпадающими списками), который позволяет пользователю изменять этот словарь (переключать, к какой категории относится каждый элемент). Как вручную вызвать событие CellFormatting при изменении этого словаря?
Это мой обработчик событий для форматирования ячеек:
private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
try
{
if (e.ColumnIndex > N_of_ReferenceColumns)
{
if (e.Value.ToString() == this.dataGridView.Rows[e.RowIndex].Cells[dataGridView.Columns[convertItemToCategory(dataGridView.Columns[e.ColumnIndex].Name)].Index].Value.ToString())
{
e.CellStyle.BackColor = Color.Green;
e.CellStyle.SelectionBackColor = Color.DarkGreen;
}
else
{
e.CellStyle.BackColor = Color.Red;
e.CellStyle.SelectionBackColor = Color.DarkRed;
}
}
}
catch
{ }
}
И это мой обработчик при изменении значений в Combobox для категории для каждый из элементов:
private void DictionarydataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
UpdateDictionary(DictionarydataGridView.Rows[e.RowIndex].Cells[1].Value.ToString(), DictionarydataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());
}
И вот как я обновляю свой словарь и как я использую его в логах условного форматирования c:
public static IDictionary<string, string> Dictionary = new Dictionary<string, string>();
public void UpdateDictionary(string key, string value)
{
Dictionary[key] = value;
}
public static string convertItemToCategory(string key)
{
string value = "";
if (Dictionary.TryGetValue(key.ToUpper(), out value))
{
return value;
}
else
{
return key.ToUpper();
}
}
Что мне нужно сделать, это когда я обновляю Словарь, также вызывает событие CellFormatting, чтобы обновления условного форматирования основывались на новом выделении.
Один из способов - упаковать логи c обновления в отдельный метод, а затем вызывать его отдельно для каждого события. обработчик, я не уверен, что делать со всем e.CellStyle.BackColor и так далее ...
Есть идеи?