3

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

我正在使用基础wxGrid,并且通过用鼠标拖动它们启用了列重新排序(EnableDragColMove(true))。我现在的问题是,在将列拖到新位置,我需要获取移动列的新位置/索引。

不幸的是,我无法从可用的 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. 在列移动到其新位置后手动触发回调或计时器事件,类似于另一篇 SO 帖子中建议的 wxPython 解决方法。

不过,我想知道是否有一种更清洁、更简单的方法,而无需求助于上述解决方法。

任何建议表示赞赏。

4

1 回答 1

4

是的,这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);
          ...
     });
}
于 2017-02-13T22:42:49.690 回答