Код всегда получает основной текст ListViewItem, потому что вы каждый раз возвращаете SubItem.Item (0) для X-го элемента. SubItem.Item (0) - текстовое поле элемента. Если вы хотите получить только первый подэлемент, измените SubItem.Item (0) на SubItems.Item (1). Если вы хотите получить произвольный подпункт, см. Пример ниже.
Из MSDN:
The first subitem in the ListViewItem::ListViewSubItemCollection is always
the item that owns the subitems. When performing operations on subitems in the
collection, be sure to reference index position 1 instead of 0 to make changes
to the first subitem.
Exmaple:
Delegate Function lvExtractedCallback(ByVal x As Integer, ByVal y As Integer) As String
Private Function lvExtracted(ByVal x As Integer, ByVal y As Integer) As String
Static Dim lvName As String
If Me.OptionsList.InvokeRequired Then
Dim lvEC As New lvExtractedCallback(AddressOf lvExtracted)
Me.Invoke(lvEC, (New Object() {x, y})) '<-- This may need to be fixed, I'm rusty at VB.
Else
lvName = OptionsList.Items.Item(x).SubItems.Item(y).Text
End If
Return lvName
End Function