当用户将列拖动到新索引时,会触发wx.grid.EVT_GRID_COL_MOVE
事件。处理程序接收wx.grid.GridEvent
,其中包含属性Col
,其中包含已移动列的旧索引。该事件似乎不包含任何详细说明列已移动到到的位置的属性。我怎么知道这个?
答案 0 :(得分:2)
如果发生EVT_GRID_COL_MOVE
事件,GridEvent.GetCol()
会返回正在移动的列的 ID 。可以使用Grid.GetColPos(colId)
获取列的实际位置。然而,
wxWidgets 2.8和wx 2.9:
在wx 2.8
中,{<1}}在列移动后发送,这会阻止您否决该事件。
因此,在活动期间调用EVT_GRID_COL_MOVE
将返回列的 new 位置。
在GetColPos()
中,{<1}}在移动列之前触发,并且否决该事件将阻止该列移动。
在活动期间致电wx 2.9
将返回该列的当前位置。
根据鼠标位置在内部计算列的新位置。 在python中复制该代码可能会与将来可能破坏该程序的版本冲突。
使用EVT_GRID_COL_MOVE
,您可以实施一种解决方法,为您提供新的列位置,并允许您“否决”(或更确切地说撤消)移动:
GetColPos()
wx 2.9+
请注意,如果必须撤消移动(self.Bind(wx.grid.EVT_GRID_COL_MOVE, self.OnColMove)
内部和第二次),def OnColMove(self,evt):
colId = evt.GetCol()
colPos = self.grid.GetColPos(colId)
wx.CallAfter(self.OnColMoved,colId,colPos)
# allow the move to complete
def OnColMoved(self,colId,oldPos):
# once the move is done, GetColPos() returns the new position
newPos = self.grid.GetColPos(colId)
print colId, 'from', oldPos, 'to', newPos
undo = False
if undo: # undo the move (as if the event was veto'd)
self.grid.SetColPos(colId,oldPos)
将被调用两次。
或者您可以查看SetColPos
。