У меня есть 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 столбцов Reference.
Теперь у меня есть совершенно отдельный элемент управления (еще один 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
{ }
}
И это мой обработчик изменения значений в поле со списком для категории для каждого из элементов:
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());
}
И вот как я обновляю свой словарь и как использую его в логике условного форматирования:
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();
}
}
Что мне нужно сделать, так это когда я обновляю Dictionary, также вызываю событие CellFormatting, чтобы условное форматирование обновлялось на основе нового выбора.
Одним из способов было бы упаковать логику обновления в отдельный метод, а затем вызвать его отдельно от каждого обработчика событий, хотя я не уверен, что делать со всеми e.CellStyle.BackColor и т.д.
Есть идеи?