Самый простой способ - использовать свойство Index, если у вас нет уникального идентификатора или свойства Key, если вы делаете, ListItem.
Если вы решите использовать свойство Index, то вы не сможете (или, по крайней мере, сильно усложнить его) добавить любую функциональность, чтобы изменить порядок элементов списка.
Вы бы заполнили ListView на основе объектов в коллекции/наборах записей с помощью метода ListView.ListItems.Add. Свойство Index можно использовать для возврата к этому исходному объекту в зависимости от порядка элементов в ListItems, соответствующих порядку элементов в исходной коллекции объектов.
В качестве альтернативы, если вы предпочитаете большую гибкость при использовании уникального ключа, но не хотите изменять базовый объект, то вы можете тривиально построить уникальный ключ (самым простым из которых является CStr (некоторое увеличивающееся число)) по мере добавления каждый объект в ListItems, сохраняя ключи вместе с объектами.
Затем вы можете использовать свойство .Key для ListItem. Преимущество здесь в том, что пользователю разрешено изменять элементы, удалять файлы и т. Д., Без необходимости аннулировать ваш контроль и повторно добавлять все объекты, чтобы сохранить связь между индексом в источнике и индексом в списке.
Например:
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, как описано выше, но если у вас есть, например, 4 поля из SQL для записи в наборе записей, тогда у вас нет «объекта» в смысле возможности называть свойства на нем.Пожалуйста, укажите в своем вопросе или в комментарии к этому, если вы это сделаете, так как может быть лучшее лечение для ответа на ваш вопрос или фактическая операция обновления, скорее всего, потребует различного синтаксиса или семантики (особенно если вам необходимо распространить любое обновление на источник) :)
Добавление идентификатора GUID - это хороший способ, или любой другой идентификатор, позволяющий однозначно идентифицировать объект отдельного человека. В вашем примере номер телефона может быть уникальным для каждого человека и способен действовать как идентификатор. Это не сработает, если вы ожидаете когда-либо более одного номера телефона человеку или нескольким лицам по номеру телефона. – jac
Сохранены ли ваши данные на листе Excel, базе данных Access или просто в списке Word? Откуда появляется информация Лица? – tigeravatar
Данные в этом случае загружаются из SQL. – lfrandom