如何获取 wxGrid 中移动列的新索引?

How do I get the new index of a moved column in a wxGrid?

我正在使用 wxWidgets 3.1.0 并且我正在用 C++ 开发 Windows 应用程序。

我正在使用底座 wxGrid and I've enabled column re-ordering via dragging them with the mouse (EnableDragColMove(true))。我现在的问题是,我需要在 列被拖动到新位置后获得移动列的新 position/index

不幸的是,我无法从可用的 API 中找到执行此操作的方法。

我已经尝试捕获 wxGridEvent wxEVT_GRID_COL_MOVE then using GetCol() and 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 );

    ...
}

但事件似乎在 BEFORE 列实际移动之前触发,因此 GetColPos() 仍将 return当前列索引,不是新索引。

列移动后似乎没有要捕获的事件。

我目前的 solutions/workarounds 是:

  1. 在捕捉到 wxEVT_GRID_COL_MOVE 事件后手动处理列移动(如 wxWidgets 文档中所建议),以便我可以正确跟踪之前在移动列的索引之后。

  2. 在列移动到新位置后手动触发回调或计时器事件,类似于 another SO post 中建议的 wxPython 解决方法。

尽管如此,我想知道是否有更简洁、更简单的方法而不诉诸上述解决方法。

如有任何建议,我们将不胜感激。

是的,这个 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);
          ...
     });
}