C# как да задействам събитие 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 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 и така нататък...

Някакви идеи?


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