如何禁用wxGrid中的多选?

时间:2012-02-21 14:09:41

标签: wxwidgets

我想在wxGrid中只选择一行。 可以在wxGrid中禁用多选吗? 我试过SetSelectionMode,它帮助我只选择行。但我不能用它来进行单行选择。

3 个答案:

答案 0 :(得分:0)

捕获wxEVT_GRID_SELECT_CELL事件。

使用GetSelectedRows()获取所选行的数组。

如果选择了多行 -

  • 使用SelectRow()取消选择除数组中第一行之外的所有内容。

答案 1 :(得分:0)

    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()

答案 2 :(得分:0)

我已经看到这个问题很老了,但在互联网上这个论点并没有那么多。

互联网上发布的许多解决方案都没有完成或有些怪癖。 这是我的解决方案。我有一个继承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上选择单行的最接近的。