Имам 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 Event Handler, след което, ако има съвпадение, оцветява клетката в зелено, в противен случай - в червено.
С други думи, в манипулатора на събитието 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
{ }
}
И това е моят манипулатор за промяна на стойностите в комбинирания списък за категория за всеки от елементите:
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();
}
}
Това, което трябва да направя, е, когато актуализирам речника, също да повдигна събитието CellFormatting, така че условното форматиране да се актуализира въз основа на нов избор.
Един от начините би бил да пакетирате логиката на актуализацията в отделен метод и след това да го извикате отделно от всеки манипулатор на събития, но не съм сигурен какво да правя с всички e.CellStyle.BackColor и така нататък...
Някакви идеи?