Я видел, что этот вопрос довольно старый, но об этом аргументе в Интернете не так много.
Многие решения, размещенные в Интернете, не завершены или имеют некоторые причуды.Вот мое решение.У меня есть класс, который наследует wxGrid, со следующими методами
void ReportGrid::DisableRangeHandler (wxGridRangeSelectEvent &ev)
{
if( ev.Selecting() && (ev.GetTopRow() != ev.GetBottomRow()) ) {
ev.StopPropagation();
ev.Veto();
}
}
void ReportGrid::DisableRangeSelectCellHandler (wxGridEvent &ev)
{
SelectRow(ev.GetRow());
}
void ReportGrid::DisableCtrlMaiusHandler (wxGridEvent &ev)
{
if (ev.ControlDown() || ev.ShiftDown()){
ev.Veto();
} else {
ev.Skip();
}
}
void ReportGrid::DisableDraggingHandler (wxMouseEvent &ev)
{
if (ev.Dragging()){
ev.Skip(false);
}
}
void ReportGrid::SingleSelectionMode(bool enabled)
{
if (_singleSelection == enabled){
return;
}
if (enabled){
Bind(wxEVT_GRID_RANGE_SELECT, &ReportGrid::DisableRangeHandler, this);
Bind(wxEVT_GRID_SELECT_CELL, &ReportGrid::DisableRangeSelectCellHandler, this);
Bind(wxEVT_GRID_CELL_LEFT_CLICK, &ReportGrid::DisableCtrlMaiusHandler, this);
GetGridWindow()->Bind(wxEVT_MOTION, &ReportGrid::DisableDraggingHandler, this);
_singleSelection = true;
} else {
Unbind(wxEVT_GRID_RANGE_SELECT, &ReportGrid::DisableRangeHandler, this);
Unbind(wxEVT_GRID_SELECT_CELL, &ReportGrid::DisableRangeSelectCellHandler, this);
Unbind(wxEVT_GRID_CELL_LEFT_CLICK, &ReportGrid::DisableCtrlMaiusHandler, this);
GetGridWindow()->Unbind(wxEVT_MOTION, &ReportGrid::DisableDraggingHandler, this);
_singleSelection = false;
}
}
Это самый близкий вариант, когда у меня был выбор одной строки в wxWidgets.