【发布时间】:2012-02-21 14:09:41
【问题描述】:
我只想在 wxGrid 中选择一行。
是否可以在 wxGrid 中禁用多选?
我试过SetSelectionMode,它可以帮助我只选择行。但我不能将它用于单行选择。
【问题讨论】:
标签: wxwidgets
我只想在 wxGrid 中选择一行。
是否可以在 wxGrid 中禁用多选?
我试过SetSelectionMode,它可以帮助我只选择行。但我不能将它用于单行选择。
【问题讨论】:
标签: wxwidgets
捕获 wxEVT_GRID_SELECT_CELL 事件。
使用 GetSelectedRows() 获取选定行的数组。
如果选择了多行 -
【讨论】:
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()
【讨论】:
我已经看到这个问题很老了,但互联网上关于这个论点的内容并不多。
互联网上发布的许多解决方案未完成或存在一些怪癖。 这是我的解决方案。我有一个继承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 上进行单行选择。
【讨论】: