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



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

我使用的是基本的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. 在列移动到新位置后手动触发回调或计时器事件,类似于另一篇SO文章中建议的wxPython解决方法。

不过,我想知道是否有一种更清洁、不那么复杂的方法,而不必求助于上述解决方案。

欢迎提出任何建议。

是的,这个wxEVT_GRID_COL_MOVE是在移动列之前生成的,因为它可以被否决,从而防止移动的发生。的确,如果它带有新的列位置会很方便,但不幸的是,目前它没有(修复这个问题很简单,任何这样做的补丁都是受欢迎的!)。

不过,在不更改wxWidgets的情况下,稍后使用CallAfter()执行代码的标准解决方法应该可以正常工作。也就是说,假设你使用C++11,你应该能够只写

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

最新更新