2012-12-27 50 views
2

我想排序一個wxGrid。現在,the documentation告訴我它不支持排序,但它確實生成了一個事件。本文檔告訴我該事件被稱爲wxEVT_GRID_COL_SORT。很公平!如何處理wxEVT_GRID_COL_SORT事件以對網格進行排序?

現在,問題是我根本不知道如何讓事件發揮作用。我有一個我的框架事件表,看起來像這樣:

BEGIN_EVENT_TABLE(MainWindow, wxFrame) 
EVT_BUTTON(XRCID("toevoegknop"), MainWindow::openAddWindow) 
// A few other events that work 
END_EVENT_TABLE() 

列出的事件已經工作得很好。在我的主窗口I類聲明的函數:

void sortColumn(wxGridEvent& event); 

現在,我想補充說:wxEVT_GRID_COL_SORT事件。從我的角度來看,文檔並不是非常清楚我應該做什麼,所以我只是嘗試通過將以下行添加到事件表來添加事件。

wxEVT_GRID_COL_SORT(MainWindow::sortColumn) 

帶來語法錯誤,因此它是不正確的。我注意到EVT剛開始的其他事件,所以我試圖刪除wx,但我仍然運氣不佳。

搜索互聯網無遠弗把我帶到一個pastebin post其通過將下面的一行到框架的構造函數(在我的情況主窗口)

Grid->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&Frame::OnGridColSort); 

這我適應這樣的(在處理事件對於主窗口幾乎整個構造)

MainWindow::MainWindow(const wxString& title, const wxPoint& pos, const wxSize& size, Collection* library, MovieDB* database) 
: wxFrame(), library_(library), database_(database) { 
wxXmlResource::Get()->LoadFrame(this, NULL, _T("hoofdvenster")); 

SetSize(size); 
grid_ = (wxGrid *)FindWindowById(XRCID("filmtabel")); 
// Irrelevant code removed, setting up the grid labels etc. 

grid_->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&MainWindow::sortColumn); 
} 

其中拋出了一個錯誤:

‘wxEVT_GRID_COL_SORT’ was not declared in this scope

所以現在我不知道我還能嘗試什麼。請記住,我幾天前纔開始討論wxWidgets,所以對於任何wxWidgets用戶來說,這些都是微不足道的。

在此先感謝!

回答

3

看來您使用的是wx 2.8.12,它不會執行wxEVT_GRID_COL_SORT。它被添加到wx 2.9,所以你必須得到最新的開發版本(2.9.4)才能使用它。

但是,在wx 2.8中,您可以處理wxEVT_GRID_LABEL_LEFT_CLICK並相應地分派事件以模擬事件。

要麼添加事件到事件地圖,

EVT_GRID_CMD_LABEL_LEFT_CLICK(ID_GRID,Frame::OnGridLabelLeftClick) 

,或者在你的構造連接:

grid->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, 
    (wxObjectEventFunction)&Frame::OnGridLabelLeftClick); 
void Frame::OnGridColSort(wxGridEvent& event) {} 
void Frame::OnGridRowSort(wxGridEvent& event) {} 

void Frame::OnGridLabelLeftClick(wxGridEvent& event) { 
    // GetCol and GetRow will return the index of the col/row label clicked 
    event.Skip(); // the next handler will select col/row/everything, based 
        // on the label clicked; remove to prevent selection 
    if(event.GetCol() >= 0) 
     OnGridColSort(event); 
    else if(event.GetRow() >= 0) 
     OnGridRowSort(event); 
    else 
     ; // if both are -1, the upper left corner was clicked (select all) 
} 

這將類似的行爲EVT_GRID_COL_SORT

相關問題