C# как вызвать событие DataGridView CellFormatting извне? - PullRequest
1 голос
/ 11 января 2020

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

Есть идеи?

1 Ответ

1 голос
/ 11 января 2020

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

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

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

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

Возможно, это наиболее интенсивное решение, но это должно сделать работу.

...