listctrl не заполняется должным образом

Поэтому мне удалось получить список элементов в заданном порядке, чтобы правильно заполнить базу данных. при преобразовании элементов для заполнения виджета listctrl, который показывает элементы, включенные в заказ ...... Я получаю это: введите здесь описание изображения

в левом окне показано, что происходит, когда вы добавляете 1-й элемент... в правом окне заключается моя проблема. он по существу перезаписывает текст 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


person Sean Perez    schedule 23.05.2013    source источник
comment
Показанный код не выглядит так, как будто он может дать результаты в показанном графическом интерфейсе. Ваш цикл for не использует запись для заполнения listctrl, каждый раз, когда он зацикливается для каждого элемента в записи, он использует одни и те же переменные self.entry и self.entryit.   -  person Yoriz    schedule 23.05.2013
comment
хорошо... изменил его, так что все ссылаются на entryit, который является объектом, в котором хранятся детали элементов.... происходит то же самое...   -  person Sean Perez    schedule 23.05.2013
comment
@ Ая... ничего хорошего, ничего не изменилось.....   -  person Sean Perez    schedule 23.05.2013


Ответы (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
person Aya    schedule 23.05.2013
comment
@ Ая... есть ли способ очистить словарь entrydict на случай, если мне придется удалить элемент? - person Sean Perez; 23.05.2013
comment
@SeanPerez Лучшее решение этой проблемы будет зависеть от того, для чего вы используете entrydict. Было бы полезно включить любые части кода, которые обращаются к нему - на данный момент все, что я вижу, это то, что вы его создаете, но никогда не используете. - person Aya; 23.05.2013
comment
@SeanPerez Смотрите обновленный ответ, и если у вас есть какие-либо комментарии, можете ли вы поместить их в этот ответ, а не в вопрос, иначе я не получу уведомление. - person Aya; 23.05.2013
comment
Ну, на самом деле это часть более крупного приложения, работающего с sql. данные, которые я вставляю, по сути являются данными из серверной части sql. Я знаю, что это связано с тем, как мой список обновления вставляет элементы, учитывая, что он по существу перезаписывает 1-ю запись списка и записывает пробелы для остальных. но указанные данные правильно вставлены в серверную часть SQL... Я действительно предпочел бы не публиковать весь свой код, учитывая, что это локализованная вещь с моей функцией refresh_list2..... как ни странно, она работает правильно при применении в других моих модулях и Я не могу понять, почему - person Sean Perez; 23.05.2013
comment
Я почти всегда использую ObjectListView вместо ListCtrl только потому, что его интерфейс намного лучше, и я думаю, что его проще использовать с базой данных. - person Mike Driscoll; 23.05.2013
comment
Я до сих пор нахожу это довольно странным........ Не знаю почему. На самом деле я использую ту же функцию с точки зрения кода для добавления заказов в основной список, и она отлично работает. не знаю, почему он вышел из строя, когда я использую его здесь - person Sean Perez; 23.05.2013
comment
Вы уже проверили, какая запись на самом деле устанавливает значения графического интерфейса, печатая их, код графического интерфейса может быть в порядке, и то, что вы устанавливаете, не в порядке. - person Yoriz; 24.05.2013