Как отключить множественный выбор в wxGrid? - PullRequest
3 голосов
/ 21 февраля 2012

Я хочу выбрать только одну строку в wxGrid. Возможно ли отключить множественный выбор в wxGrid? Я пробовал SetSelectionMode, это помогает мне выбирать только строки. Но я не могу использовать его для выделения одной строки.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2013
    wx.EVT_MOTION(self.grid.GetGridWindow(), self.OnMouseMotion)
    wx.EVT_LEFT_DOWN(self.grid.GetGridWindow(), self.OnMouseLeftDown)
    wx.EVT_KEY_DOWN(self.grid.GetGridWindow(), self.OnKeyPress)

def OnMouseMotion(self,event):
    if event.Dragging():
        return
    else: 
        event.Skip()

def OnMouseLeftDown(self,event):
    if event.AltDown() or event.ShiftDown() or event.ControlDown():
        return
    else:
        event.Skip()

def OnKeyPress(self,event):
    if event.GetKeyCode() in [wx.WXK_SHIFT,wx.WXK_ALT,wx.WXK_CONTROL,wx.WXK_UP,wx.WXK_DOWN,]:
        return
    else:
        event.Skip()
0 голосов
/ 31 октября 2013

Я видел, что этот вопрос довольно старый, но об этом аргументе в Интернете не так много.

Многие решения, размещенные в Интернете, не завершены или имеют некоторые причуды.Вот мое решение.У меня есть класс, который наследует 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.

0 голосов
/ 21 февраля 2012

Захватить событие wxEVT_GRID_SELECT_CELL.

Используйте GetSelectedRows () для получения массива выбранных строк.

Если выбрано более одной строки -

  • Используйте SelectRow (), чтобы отменить выбор всего, кроме, скажем, первой строки в массиве.
...