这是书上的一个例子,使用Listbox的ItemData属性作为进入另一个结构的序号。
    假定已有一个产品名称和说明的列表:
    type ProductUDT
        Name as string
        Description as string
        Price as Currency
    end type    dim Products() as ProductUDT, i as long    private sub form_load()
        '从数据库中读产品信息到products(), 代码略。
        '读产品名称到已设置排序的listbox:
        for i=lbound(products) to ubound(products)
            lstProducts.Additem Products(i).Name
            '设置ItemData与products()的下标相对应:
            lstProducts.ItemData(lstProducts.NewIndex)=i
        next
    end sub    Private sub lstProducts_click()
        '显示选定产品的说明及单价:
        i=lstProducts.ItemData(lstProducts.ListIndex)
        lblDescription.Caption=Products(i).Description
        lblPrice.Caption=Products(i).Price
    end sub    
    上面这段程序的功能应该很清楚了。实现也没有什么问题。看上去挺合理的。    而我现在的疑问是,产品的记录集可能会变化的,比如经过几次增加与删除之后,lstProducts.itemdata的值就可能不连续了,与数组的下标怎么保持对应呢?
    记录集的每次删除动作,都跟一个重新填写products()数组和lstproducts列表的动作吗?不太好吧?
    如果不用数组改用集合来存放产品信息,那么,删除产品时好处理一点,新增产品时,itemdata不太好确定了,要遍历每项itemdata的值,找出最大的,再加一?感觉效率上不是很好。不考虑用产品名作为itemdata的值。因为记录集不一定是产品记录,可能是别的,第一列不一定是主键或唯一记录。    大家看看有没有什么好的点子?    谢谢回复。

解决方案 »

  1.   

    请问楼主,如果你的lstProducts.ItemData(lstProducts.NewIndex)=i
    i不是从0开始,你怎么处理
      

  2.   

    我的思路, 自己定义个集合类, 在类的Add方法中定义一个static整型变量,看例子意思似乎是只要有唯一的产品ID可与listbox的item的itemdata对应就行了,不知可否
      

  3.   

    我觉得,用.tag附加属性比较好
      

  4.   

    当删除,增加,后,itemdata的值就可能不连续了,怎么遍历呀,我是用的remove topindex的方法遍历,我想知道,能否有更好的方法。