0

所以我设法以给定的顺序获取项目列表,以便正确填充数据库。当转换项目以填充显示订单中包含的项目的 listctrl 小部件时......我得到了这个: 在此处输入图像描述

左侧窗口显示添加第一项时会发生什么......右侧窗口是我的问题所在。它基本上覆盖了第一个项目的文本并添加了一个空白列......但是价格正确地加起来并且所有项目都正确地添加到 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 存储项目对象的过滤列表

4

1 回答 1

1

哦, 的喜悦wx.ListCtrl。;-)

在围绕它编写一个包装类以显着减轻痛苦之前,我花了很多个小时与那些人争吵。

你的代码有几个问题refresh_list2()......

首先,该方法将始终在指定之前InsertStringItem()插入项目,因此如果要附加到列表,则必须将 设置为大于或等于列表中当前项目数的任何值 -效果很好很好。indexindexsys.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
于 2013-05-23T13:46:19.327 回答