场景:
1. wxGrid是比较好用的可定制的table,支持单元格显示效果定制,合并,隐藏,局部刷新等等。总体来说,还是比较实用的控件。
总结:
1. 初始化
grid->CreateGrid(0, 0); grid->EnableGridLines(true); grid->SetRowLabelSize(32); grid->SetDefaultRowSize(140); grid->SetScrollLineX(1); wxFont font(9, wxFONTFAMILY_SWISS, wxNORMAL, wxNORMAL, false, wxT("Arial"), wxFONTENCODING_ISO8859_1); grid->SetLabelFont(font); grid->SetSelectionMode(wxGrid::wxGridSelectCells); grid->HideCellEditControl(); grid->SetEditable(true); grid->SetCellHighlightPenWidth(0); grid->EnableDragGridSize(false); grid->SetUseNativeColLabels(true); AddTitle(grid, wxT("."), 112, true); AddTitle(grid, wxT("."), 112, true); AddTitle(grid, wxT("."), 112, true); AddTitle(grid, wxT("."), 112, true); AddTitle(grid, wxT("."), 112, true); grid->SetColLabelSize(0); wxColor color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); grid->SetSelectionBackground(color);
2.添加行
grid_->InsertRows(position, 1, false); DhPhotoCheckCellRender* render = new DhPhotoCheckCellRender(); render->SetShowText(array[0]); render->CenterCheckOffset(); grid_->SetReadOnly(position, 0, true); grid_->SetCellRenderer(position, 0, render); grid_->SetCellValue(position, 0, wxT(" "));
class DhPhotoCheckCellRender: public wxGridCellRenderer
DhPhotoCheckCellRender* render = (DhPhotoCheckCellRender*) current_show_grid_->GetCellRenderer( i, j); render->DecRef();
5.wxGrid对动态增加列貌似支持不好,我Del 全部列再新增列就会崩溃,可能是bug吧,这个问题已经找到原因,是del全部后insert行就会触发一个wxEVT_GRID_SELECT_CELL事件,很奇怪,之后这个事件触发函数调用了一个没创建的自定义render就会崩溃.
grid_->DeleteAllRows(); grid_->HideOtherCols(5);
备注(wx3.0.0): 快速DeleteRows并且InsertRows经常会崩溃,临时解决方案是先AppendRows到末尾,之后再删除前面的.
6.绑定常用的事件
grid->Connect(wxEVT_GRID_SELECT_CELL, wxGridEventHandler(DhRecoveryKindWindow::OnCellLeftClick), NULL, this);
7.设置列宽和表头
SetColLabelValue(index, label); SetColSize(index, width);
8.添加表头
AddTitle
int col_num = grid->GetNumberCols(); grid->AppendCols(); if (is_show) { grid->ShowCol(col_num); grid->SetColLabelValue(col_num, grid_title); grid->SetColSize(col_num, grid_width); grid->SetColLabelAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE); } else { grid->HideCol(col_num); }