Быстрое отображение выделенной ячейки по столбцам и строчкам C++\CLI

Когда я выделяю ячейку, хочу чтобы это было примерно незаметно (как в excel). Но при моей реализации почему то видно как ячейки закрашиваются последовательно, как исправить код таким образом, чтобы было быстро всё? Сам я ускорил лишь чуть-чуть, благодаря циклам while.
Уверен что есть способ по проще)

void MyForm::dataGridView1_SelectionChanged(Object^ sender, EventArgs^ e)
{
    //Выделение активной ячейки по столбцу и строке
    CurrColNew = dataGridView1->CurrentCell->ColumnIndex;
    CurrRowNew = dataGridView1->CurrentCell->RowIndex;
    short col = CurrColNew;
    short row = CurrRowNew;

    short colold = CurrColOld;
    short rowold = CurrRowOld;

    Color& rowheadbackcolornew = dataGridView1->Columns[CurrColNew]->HeaderCell->Style->BackColor;
    int stp = 65;

    if (CurrColOld != CurrColNew || CurrRowOld != CurrRowNew)
    {
        if (rowheadbackcolornew == Color::FromArgb(127, 118, 121))
            rowheadbackcolornew = Color::FromArgb(127, 118 + stp, 121);

        else if (rowheadbackcolornew == Color::FromArgb(0, 190, 20))
            rowheadbackcolornew = Color::FromArgb(0, 190 + stp, 20);
        
        else if (rowheadbackcolornew == Color::FromArgb(0, 162, 254))
            rowheadbackcolornew = Color::FromArgb(0, 162 + stp, 254);

        else if (rowheadbackcolornew == Color::FromArgb(190, 0, 0))
            rowheadbackcolornew = Color::FromArgb(190, 0 + stp, 0);

        else if (rowheadbackcolornew == Color::FromArgb(255, 255, 255))
            rowheadbackcolornew = Color::FromArgb(255, 245, 194);
            
        dataGridView1->Columns[CurrColNew]->HeaderCell->Style->BackColor = rowheadbackcolornew;

        short i = 0;
        while (i < colold)
        {
            if (getColorCell(i, rowold) == Color::FromArgb(255, 245, 194))
                SetColor(i, rowold, Color::FromArgb(255, 255, 255));
            i++;
        }

        short j = 0;
        while (j < rowold)
        {
            if (getColorCell(colold, j) == Color::FromArgb(255, 245, 194))
                SetColor(colold, j, Color::FromArgb(255, 255, 255));
            j++;
        }

        short _i = 0;
        while (_i < col)
        {

            if (getColorCell(_i, row) == Color::FromArgb(255, 255, 255))
                SetColor(_i, row, Color::FromArgb(255, 245, 194));
            _i++;
        }

        short _j = 0;
        while (_j < row)
        {
            if (getColorCell(col, _j) == Color::FromArgb(255, 255, 255))
                SetColor(col, _j, Color::FromArgb(255, 245, 194));
            _j++;

        }
    }

    Color& rowheadbackcolorold = dataGridView1->Columns[CurrColOld]->HeaderCell->Style->BackColor;

    if (rowheadbackcolorold == Color::FromArgb(127, 118 + stp, 121))
        rowheadbackcolorold = Color::FromArgb(127, 118, 121);

    else if (rowheadbackcolorold == Color::FromArgb(0, 190 + stp, 20))
        rowheadbackcolorold = Color::FromArgb(0, 190, 20);

    else if (rowheadbackcolorold == Color::FromArgb(0, 162 + stp, 254))
        rowheadbackcolorold = Color::FromArgb(0, 162, 254);

    else if (rowheadbackcolorold == Color::FromArgb(190, 0 + stp, 0))
        rowheadbackcolorold = Color::FromArgb(190, 0, 0);
    else
        rowheadbackcolorold = Color::FromArgb(255, 255, 255);

    if (CurrColOld == CurrColNew)
        dataGridView1->Columns[CurrColOld]->HeaderCell->Style->BackColor = rowheadbackcolornew;
    else
        dataGridView1->Columns[CurrColOld]->HeaderCell->Style->BackColor = rowheadbackcolorold;

    CurrRowOld = CurrRowNew;
    CurrColOld = CurrColNew;
}

Код пользовательских функций:

Color MyForm::getColorCell(int i, int j)
{
    return dataGridView1[i, j]->Style->BackColor;
}

void MyForm::SetColor(int i, int j, const Color& newColor)
{
    dataGridView1[i, j]->Style->BackColor = newColor;
}

Ответы (1 шт):

Автор решения: mEl

Проблема решилась тем, что нужно использовать двойную буферизацию у datagridview. Просто так это свойство не включить. На просторах интернета нашёл способ:

Подключаем пространство имён в заголовок формы:

using namespace System::Reflection;

Добавляем вот такую вот функцию:

void SetDoubleBuffered(Control^ c, bool value)
{
    PropertyInfo^ pi = c->GetType()->GetProperty("DoubleBuffered", BindingFlags::SetProperty | BindingFlags::Instance | BindingFlags::NonPublic);
    if (pi != nullptr) {
        pi->SetValue(c, value, nullptr);
    }

    MethodInfo^ mi = c->GetType()->GetMethod("SetStyle", BindingFlags::Instance | BindingFlags::InvokeMethod | BindingFlags::NonPublic);
    if (mi != nullptr) {
        mi->Invoke(c, gcnew array <Object^> { ControlStyles::UserPaint | ControlStyles::AllPaintingInWmPaint | ControlStyles::OptimizedDoubleBuffer, true });
    }

    mi = c->GetType()->GetMethod("UpdateStyles", BindingFlags::Instance | BindingFlags::InvokeMethod | BindingFlags::NonPublic);
    if (mi != nullptr) {
        mi->Invoke(c, nullptr);
    }
}

Далее в конструктор формы дописываем:

SetDoubleBuffered(dataGridView1, true);
→ Ссылка