【问题标题】:How to disable multi selection in a wxGrid?如何在 wxGrid 中禁用多选?
【发布时间】:2012-02-21 14:09:41
【问题描述】:

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

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

    捕获 wxEVT_GRID_SELECT_CELL 事件。

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

    如果选择了多行 -

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

    【讨论】:

      【解决方案2】:
          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()
      

      【讨论】:

        【解决方案3】:

        我已经看到这个问题很老了,但互联网上关于这个论点的内容并不多。

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

        【讨论】:

          猜你喜欢
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多