С#, как запустить событие DataGridView CellFormatting извне?

У меня есть 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 и т.д.

Есть идеи?


person miguello    schedule 11.01.2020    source источник
comment
Обратите внимание, что это событие вызывается раздельно для каждой ячейки.   -  person TaW    schedule 12.01.2020


Ответы (1)


Быстрый хак, который никогда не подведет, заключается в том, чтобы заставить сетку данных повторно привязаться к источнику данных, сбросив источник данных.

В этом потоке есть длительные обсуждения темы: C# обновляет DataGridView при обновлении или вставке в другую форму

Вы можете поместить вспомогательный метод в форму:

public void Refresh()
{
    datagridview1.DataSource = datagridview1.DataSource; // should re-evaluate all logic related to data bindings
    datagridview1.Refresh(); // forces the control to repaint
}

Это, вероятно, самое интенсивное решение, но оно должно выполнять свою работу.

person Chris Schaller    schedule 11.01.2020