因此,我设法获取给定顺序中的项目列表,以正确填充数据库。转换项目以填充listctrl小部件,显示订单中包含的项目.......我得到这个:
左侧窗口显示添加第1项时会发生什么....右侧窗口是我的问题所在。它基本上覆盖了第一个项目的文本并添加了一个空白列....但是价格正确加起来并且所有项目都正确地添加到sql数据库中...所以我的问题在于我如何填充我的列表
下面显示的代码是填充前面显示的列表ctrl的函数...我似乎无法找出出错的地方......有什么想法吗?
重启列表的代码
def refresh_list2(self, event):
"""Place the names of each ItemEntry into the list"""
index = 0
self.entrydict = {}
self.list2.DeleteAllItems()
for entry in self.ordite.list_entries():
if entry.Order_ID == self.entry.Order_ID:
self.list2.InsertStringItem(index,self.entry.Order_ID)
self.list2.SetStringItem(index,1,self.entryit.Item_ID)
self.list2.SetStringItem(index,2,str(self.entryit.Item_Price))
self.list2.SetStringItem(index,3,str(self.entryit.Item_Qty))
self.entrydict[index] = entry
index += 1
将项目插入数据库的代码
def add_item(self, event):
"""Add a new entry to the Order_Date ite"""
# start out with blank, generic Entry
self.entryit = oi.OrderItemEntry(self.entry.Order_ID,"","","0")
self.endiag = AddItemOrder(self,self.entryit)
self.endiag.ShowModal()
self.ordite.add_entry(self.entry.Order_ID,
str(self.entryit.Item_ID),
str(self.entryit.Item_Price),
str(self.entryit.Item_Qty) )
self.refresh_list2(None)
self.addPrice(None)
仍在考虑在后端创建一个函数,该函数根据给定的order_ID存储项目对象的过滤列表
答案 0 :(得分:1)
哦,wx.ListCtrl
的乐趣。 ; - )
我花了一个多小时与那些人争斗,然后在它周围写了一个包装类,以减轻它的痛苦。
您的refresh_list2()
代码存在一些问题......
首先,InsertStringItem()
方法将始终在指定的index
之前插入项,因此如果要附加到列表,则必须设置index
任何大于或等于列表中当前项目数量的值 - sys.maxint
效果非常好。
其次,InsertStringItem()
将返回其插入项目的索引,因此您必须在对SetStringItem()
的任何后续调用中使用该值。
尝试这样的事情......
def refresh_list2(self, event):
"""Place the names of each ItemEntry into the list"""
self.entrydict = {}
self.list2.DeleteAllItems()
for entry in self.ordite.list_entries():
if entry.Order_ID == self.entry.Order_ID:
index = self.list2.InsertStringItem(sys.maxint, self.entry.Order_ID)
self.list2.SetStringItem(index, 1, self.entryit.Item_ID)
self.list2.SetStringItem(index, 2, str(self.entryit.Item_Price))
self.list2.SetStringItem(index, 3, str(self.entryit.Item_Qty))
self.entrydict[index] = entry
...哪个应该达到预期的结果,但是如果您随后从列表中删除了一个项目,那么稍后您可能会遇到self.entrydict
的问题,因为索引值可能会发生变化。
<强>更新强>
不确定你在做什么,但以下自包含示例适用于我......
import sys
import wx
data = (('O0012', '1001', '235.0', '1'),
('O0012', '1002', '600.0', '2'))
app = wx.App(redirect=False)
frame = wx.Frame(None)
lc = wx.ListCtrl(frame, style=wx.LC_REPORT)
lc.InsertColumn(0, 'Order ID')
lc.InsertColumn(1, 'Item ID')
lc.InsertColumn(2, 'Item Price')
lc.InsertColumn(3, 'Item Qty')
for a, b, c, d in data:
index = lc.InsertStringItem(sys.maxint, a)
lc.SetStringItem(index, 1, b)
lc.SetStringItem(index, 2, c)
lc.SetStringItem(index, 3, d)
frame.Show()
app.MainLoop()
更新#2
阿。我认为您打算插入本地entry
变量中的项目,而不是实例属性......
def refresh_list2(self, event):
"""Place the names of each ItemEntry into the list"""
self.entrydict = {}
self.list2.DeleteAllItems()
for entry in self.ordite.list_entries():
if entry.Order_ID == self.entry.Order_ID:
index = self.list2.InsertStringItem(sys.maxint, entry.Order_ID)
self.list2.SetStringItem(index, 1, entry.Item_ID)
self.list2.SetStringItem(index, 2, str(entry.Item_Price))
self.list2.SetStringItem(index, 3, str(entry.Item_Qty))
self.entrydict[index] = entry