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

标签 c++ windows wxwidgets wxgrid

我正在使用 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 );

    ...
}

但事件似乎是在BEFORE列实际移动之前触发的,所以GetColPos()仍将返回当前列索引,NOT 新索引。

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

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

  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);
          ...
     });
}

关于c++ - 如何获取 wxGrid 中移动列的新索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196986/

相关文章:

c# - 以编程方式循环遍历 DatagridView 并选中复选框

c++ - 在 Windows 上将应用程序限制为每个 shell session 一个实例

c++ - 程序入口点 sqlite3_db_filname 无法位于 dll 中

c++ - C++中BYTE数组的长度

C++ 数组 : Go from 1D to 2D

c++ - 在类中定义变量

c++ - 自定义 wxTextCtrl 自动完成

c++ - C++ 中的延迟评估包装类?

c++ - 获取 OSName 作为字符串 C++

c++ - wxWidgets 在调用 wxApp::OnInit 之前退出