Быстрое отображение выделенной ячейки по столбцам и строчкам 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);