2017-02-13 2 views
4

Я использую wxWidgets 3.1.0, и я разрабатываю приложение Windows на C++.Как получить новый индекс перемещенного столбца в wxGrid?

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

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

Я попытался поймать wxGridEventwxEVT_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() по-прежнему будет возвращать текущий индекс столбца, NOT новый индекс.

Похоже, что нет события для улова ПОСЛЕ того, как столбец перемещается.

Мои текущие решения/обходные являются:

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

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

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

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

+0

Как о 'EVT_HEADER_BEGIN_REORDER (ID, Func) и' EVT_HEADER_END_REORDER (ID, FUNC) ' – macroland

+0

@macroland Я попробовал их, но [wxHeaderCtrl] (http://docs.wxwidgets.org/3.1.0/classwx_header_ctrl.html) события не запускаются. Я попытался привязать + ухватить их в моем коде wxGrid (подобно wxEVT_GRID_COL_MOVE), а также в пользовательской реализации wxGrid. –

ответ

3

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

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

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

Это будет захватывать путем копирования всего объекта 'wxGridEvent'; это мудрое? Это не маленький класс ... – bogdan

+0

Лично я считаю, что ясность важнее, особенно в кратком примере, но вы можете, конечно, извлечь только столбец из объекта 'event' и захватить его, только если хотите. –

+0

Это покажется лучшим решением. Небольшое редактирование ответа состоит в том, чтобы переместить 'event.GetCol()' вне 'CallAfter', чтобы исправить ошибку компиляции. В противном случае, хорошо. Благодарю. –

Смежные вопросы