Как получить новый индекс перемещенного столбца в wxGrid?

Я использую wxWidgets 3.1.0 и разрабатываю приложение для Windows на C ++.

Я использую базу wxGrid и я включил изменение порядка столбцов, перетаскивая их мышью (EnableDragColMove (правда)). Моя проблема сейчас в том, что мне нужно получить новую позицию / индекс перемещенного столбца после колонка была перетащена на новую позицию.

К сожалению, я не смог найти способ сделать это из доступных API.

Я пытался поймать wxGridEvent wxEVT_GRID_COL_MOVE затем с помощью GetCol () а также GetColPos () чтобы проверить новый индекс столбца:

gridDataList->Bind(wxEVT_GRID_COL_MOVE, &FormData::OnList_ColumnMove, this);

...

void FormData::OnList_ColumnMove(wxGridEvent& event)
{
int movedCol = event.GetCol();
int movedColPos = gridDataList->GetColPos(movedCol );

...
}

Но, похоже, событие спровоцировано ДО столбец фактически перемещен, так GetColPos () по-прежнему будет возвращать текущий индекс столбца, НЕ новый индекс.

Кажется, что нет события, чтобы поймать ПОСЛЕ того, как столбец перемещен.

Мои текущие решения / обходные пути:

  1. Ручная обработка движения колонны после wxEVT_GRID_COL_MOVE событие (как предложено в документации по wxWidgets), чтобы я мог правильно отслеживать индекс до и после перемещенного столбца.

  2. Вручную вызвать обратный вызов или событие таймера после того, как столбец переместится на новую позицию, аналогично обходному решению wxPython, предложенному в еще один пост.

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

Любые предложения приветствуются.

3

Решение

Да это wxEVT_GRID_COL_MOVE создается перед перемещением столбца, потому что на него можно наложить вето, предотвращая перемещение. И это правда, что было бы удобно, если бы он переносил новую позицию столбца, но, к сожалению, в настоящее время это не так (было бы просто исправить это и любой другой патчи делают это будет приветствоваться!).

Стандартный обходной путь с помощью CallAfter() Выполнение вашего кода в более позднее время должно работать нормально, но без изменения wxWidgets. Т.е., предполагая, что вы используете C ++ 11, вы должны просто написать

void FormData::OnList_ColumnMove(wxGridEvent& event)
{
const int movedCol = event.GetCol();
CallAfter([movedCol]() {
int movedColPos = gridDataList->GetColPos(movedCol);
...
});
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]