我在我的应用中使用wx.ListCtrl
进行实时报告,并且会有持续状态更新,包括在任务开始时插入新行并在任务结束时删除相关行。由于列表不时被排序,因此您不能简单地按开头的rowid删除行。虽然您可以使用SetItemData
分配唯一ID,并且这样您就可以确切知道在完成任务时要删除哪一行,但 NOT 似乎是与删除行相关的任何方法通过该唯一ID,甚至不是通过唯一ID获取rowid的方法,并且我找到的唯一方法是GetItemData
,它将返回特定行的唯一ID。
所以我想到的唯一方法是迭代所有行检查它们的唯一id并将它与给定的id进行比较,如果它匹配则删除该行。但这听起来太笨拙了,那么排序后是否有更好的方法来删除特定的行?
答案 0 :(得分:0)
如果 你可以将你的wxPython升级到2.9.x系列然后有一个简单的答案 - 使用DataViewListCtrl - 因为显示器反映了你的数据而不是实际包含数据。因此,如果您的数据模型由于数据项(行)而发生更改而被删除,那么无论显示如何排序,您的显示都将松开该行。如果你不能,那么我怀疑你必须标记具有唯一ID的行,然后找到它们进行删除。
如果您需要执行后者,我建议您使用一个可能隐藏的RowID列,其中包含您的唯一ID,以及您使用子流程PID作为键维护的字典以及作为值的唯一ID或作为值的函数将进程ID映射到唯一的行ID。
显然在流程创建上添加新行不是问题,只需记住包含您的唯一ID即可。当您的流程结束时获取行ID并执行以下操作:
def FindRow(ID):
""" Find the row that matches the ID """
match = None
for index in range(self.TheGrid.GetNumberRows()):
if self.TheGrid.GetCellValue(index, IdColNo):
match = index
break
return match
# In your process end handler
Line = FindRow(GetID(pid))
if (Line):
self.TheGrid.DeleteRows(Line, 1)
答案 1 :(得分:0)
我最终使用ObjectListView
来完成这项工作。基本上,您为列表中的对象构建索引,然后您就可以在任何所需的行上操作。它比wx.ListCtrl