首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在wxGrid中禁用多选?

如何在wxGrid中禁用多选?
EN

Stack Overflow用户
提问于 2012-02-21 22:09:41
回答 3查看 2.7K关注 0票数 3

我只想在wxGrid中选择一行。是否可以在wxGrid中禁用多选?我尝试过SetSelectionMode,它帮助我只选择行。但我不能将它用于单行选择。

EN

回答 3

Stack Overflow用户

发布于 2012-02-21 22:31:39

捕获wxEVT_GRID_SELECT_CELL事件。

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

如果选择了多个行-

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

Stack Overflow用户

发布于 2013-04-06 00:31:16

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2013-10-31 22:37:30

我发现这个问题已经很古老了,但在互联网上关于这个问题的争论还不多。

在互联网上发布的许多解决方案都是不完整的,或者有一些奇怪的地方。这是我的解决方案。我有一个继承wxGrid的类,具有以下方法

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9378977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档