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

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

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

不幸的是,我找不到可用的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()仍然会返回当前的列索引,而不是新的索引。

在列移动之后似乎没有事件发生。

我目前的解决scheme/解决方法是:

  1. 捕获wxEVT_GRID_COL_MOVE事件(如wxWidgets文档中所build议的)后,手动处理列移动,以便正确跟踪移动的列的前后索引。

  2. 在列移动到新位置后手动触发callback或计时器事件,类似于另一个SOpost中build议的wxPython解决方法。

但是,我想知道,如果没有采取上述的解决方法,是否有一种更简洁,更简单的方法。

任何build议表示赞赏。

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