最简单的方法是使用 ListItem 的 Index 属性(如果没有任何唯一标识符)或 Key 属性(如果有)。
如果您选择使用 Index 属性,那么您不能(或者至少它会使其变得非常复杂)添加任何功能来重新排列列表项的顺序。
您将通过 ListView.ListItems.Add 方法根据集合/记录集中的对象填充 ListView。您可以使用 Index 属性根据与原始对象集合中的项目顺序相对应的 ListItems 中的项目顺序返回到该原始对象。
或者,如果您更喜欢使用唯一键的更大灵活性但不希望修改底层对象,那么您可以在将每个对象添加到 ListItems 时简单地构造一个唯一键(最简单的是 CStr(一些递增的数字)) ,将键存储在对象旁边。
然后,您可以使用 ListItem 的 .Key 属性。这里的好处是可以允许用户修改其中的项目、删除内容等,而无需使控件无效并重新添加所有对象以保持源中的索引和列表中的索引之间的链接。
例如:
Private persons As Collection
Private Sub lvExample_ItemClick(ByVal Item As MSComctlLib.ListItem)
' Change the phone number:
'Method 1, using the index of listitem within listitems
'to tie back to index in persons collection
'Don't allow rearranging/sorting of items with this method for simplicity
With persons.Item(Item.Index)
.PhoneNumber = "555-555-1234"
'...some stuff
End With
'Method 2, using a unique key
'that you generate, as the underlying person object doesn't have a necessarily unique one
'Items would have been added in a method similar to AddItemsExample1() below
With persons.Item(Item.Key)
.PhoneNumber = "555-555-1234"
'...some stuff
End With
End Sub
Sub AddItemsExample1()
'Storage requirements vs. your existing recordset or whatever
'are minimal as all it is storing is the reference to the underlying
'person object
'Adapt per how you have your existing objects
'But basically get them into a keyed collection/dictionary
Dim i As Long
Set persons = New Collection
For Each p In MyPersonsSource
persons.Add p, CStr(i)
i = i + 1
Next p
'By keying them up, you can allow sorting / rearranging
'of the list items as you won't be working off of Index position
End Sub
最后,如果您将它们放在数据库返回的记录集中,另一种方法是添加一个新字段(我想您有一个现有的对象字段)并在您的记录上运行 UPDATE 查询,用递增的数字填充它(这应该只影响本地记录集(当然首先检查记录集设置!))。以此为关键。
您在对问题的评论中提到您从 SQL 获取数据。对于列表框的所有正常目的,如上所述,通过 Collection 对象运行它们仍然可能是最简单的,但是如果您有例如来自 SQL 的 4 个字段用于记录集中的记录,那么您就没有“对象”在能够调用它的属性的意义上。如果您这样做,请在您的问题或对此的评论中指定,因为可能有更好的方法来回答您的问题,或者实际的更新操作可能需要不同的语法或语义(特别是如果您需要将任何更新传播回来源) :)