|
Mittels der Methode FindItem können Sie ein ListView-Steuerelement nach ListItems oder ListSubItems (Version 6) bzw. SubItems (Versionen 5 und 6) durchsuchen, deren Text-Eigenschaft einem bestimmten Text entspricht oder mit diesem anfängt. Eine Suche nach einem Text, der Platzhalter (Wildcards) enthält, ist damit jedoch nicht möglich.
Eine Alternative dazu finden Sie in der folgenden Funktion ListViewFind (für Version 6 - eine Variante für Version 5 finden Sie weiter unten). Die Funktion gibt Ihnen alle gefundenen Elemente in einer Collection zurück.
Im Parameter Find übergeben Sie den zu suchenden Text, der entsprechend dem Like-Operator Wildcards enthalten kann.
Im optionalen Parameter FindIn legen Sie fest, ob nur die ListItems selbst oder allein die ListSubItems (Elemente der Spalten) oder beide durchsucht werden sollen (Voreinstellung lfBoth).
Im nächsten Parameter ReturnBoth legen Sie fest, ob im Falle der Suche (auch) nach ListSubItems das zugehörige ListItem zurückgegeben werden soll. In diesem Fall wird ein Variant-Array in die Collection eingefügt, das in seinem ersten Element das ListItem und im zweiten Element das ListSubItem enthält. Somit können Sie auch bei der Suche nach ListSubItems die betreffende Zeile des ListViews verarbeiten, obwohl ein ListSubItem selbst an sich keinen Rückschluss auf sein Besitzer-ListItem gibt (das ist wohl eine Schwäche im Entwurf der ListSubItems).
Die Vergleichsmethode können Sie im vorletzten optionalen Parameter festlegen (Voreinstellung lfCompareBinary). Da in einem Modul nur eine Vergleichsmethode festgelegt werden kann (Standard ist Option Compare Binary), erfolgen die Vergleiche für die Option lfCompareText in einem separaten Modul (modLikeCompareText), das Sie ebenfalls in das betreffende Projekt laden müssen (siehe "Like Binary oder Text" khwlikecompare.htm).
Im letzten optionalen Parameter können Sie schließlich noch mit der Übergabe von Trueangeben, ob die Zeile des ersten gefundenen Elements selektiert und in den sichtbaren Bereich geschoben werden soll.
Option Compare Binary
Public Enum ListViewFindCompareMethodConstants
lfCompareBinary
lfCompareText
End Enum
Public Enum ListViewFindInConstants
lfItems = 1
lfSubItems = 2
lfBoth = 3
End Enum
Public Function ListViewFind(ListView As ListView, Find As String, _
Optional ByVal FindIn As ListViewFindInConstants = lfBoth, _
Optional ByVal ReturnBoth As Boolean = True, _
Optional ByVal CompareMethod As ListViewFindCompareMethodConstants, _
Optional ByVal SelectFirst As Boolean) As Collection
Dim nListItem As ListItem
Dim nListSubItem As ListSubItem
Dim nFound As Collection
Set nFound = New Collection
Select Case CompareMethod
Case lfCompareBinary
Select Case FindIn
Case lfItems
For Each nListItem In ListView.ListItems
If nListItem.Text Like Find Then
nFound.Add nListItem
End If
Next
Case lfSubItems
For Each nListItem In ListView.ListItems
For Each nListSubItem In nListItem.ListSubItems
If nListSubItem.Text Like Find Then
If ReturnBoth Then
nFound.Add Array(nListItem, nListSubItem)
Else
nFound.Add nListSubItem
End If
End If
Next
Next
Case lfBoth
For Each nListItem In ListView.ListItems
If nListItem.Text Like Find Then
nFound.Add nListItem
End If
For Each nListSubItem In nListItem.ListSubItems
If nListSubItem.Text Like Find Then
If ReturnBoth Then
nFound.Add Array(nListItem, nListSubItem)
Else
nFound.Add nListSubItem
End If
End If
Next
Next
End Select
Case lfCompareText
Select Case FindIn
Case lfItems
For Each nListItem In ListView.ListItems
If LikeCompText(nListItem.Text, Find) Then
nFound.Add nListItem
End If
Next
Case lfSubItems
For Each nListItem In ListView.ListItems
For Each nListSubItem In nListItem.ListSubItems
If LikeCompText(nListSubItem.Text, Find) Then
If ReturnBoth Then
nFound.Add Array(nListItem, nListSubItem)
Else
nFound.Add nListSubItem
End If
End If
Next
Next
Case lfBoth
For Each nListItem In ListView.ListItems
If LikeCompText(nListItem.Text, Find) Then
nFound.Add nListItem
End If
For Each nListSubItem In nListItem.ListSubItems
If LikeCompText(nListSubItem.Text, Find) Then
If ReturnBoth Then
nFound.Add Array(nListItem, nListSubItem)
Else
nFound.Add nListSubItem
End If
End If
Next
Next
End Select
End Select
Set ListViewFind = nFound
If SelectFirst Then
If nFound.Count Then
Select Case True
Case IsArray(nFound(1))
With nFound(1)(0)
.Selected = True
.EnsureVisible
End With
Case TypeOf nFound(1) Is ListItem
With nFound(1)
.Selected = True
.EnsureVisible
End With
End Select
End If
End If
End Function
Die Variante für Version 5 rufen Sie auf gleiche Weise auf. Lediglich der Inhalt der zurückgegebenen Collection unterscheidet sich von der Variante für Version 6. Wenn Sie hier nur bzw. auch die SubItems durchsuchen lassen, enthält die Collection Arrays, die jeweils das ListItem und den Index des SubItems enthalten. Ist die Fundstelle der Text des ListItems selbst, lautet der Index 1.
Option Compare Binary
Public Enum ListView5FindCompareMethodConstants
lf5CompareBinary
lf5CompareText
End Enum
Public Enum ListView5FindInConstants5
lf5Items = 1
lf5SubItems = 2
lf5Both = 3
End Enum
Public Function ListViewFind5(ListView As ListView, Find As String, _
Optional ByVal FindIn As ListView5FindInConstants = lf5Both, _
Optional ByVal CompareMethod As ListView5FindCompareMethodConstants) _
As Collection
Dim nListItem As ListItem
Dim nListSubItem As ListSubItem
Dim nFound As Collection
Dim i As Integer
Dim nColumnHeadersCount As Integer
Set nFound = New Collection
With ListView
Select Case CompareMethod
Case lf5CompareBinary
Select Case FindIn
Case lf5Items
For Each nListItem In .ListItems
If nListItem.Text Like Find Then
nFound.Add nListItem
End If
Next
Case lf5SubItems
nColumnHeadersCount = .ColumnHeaders.Count
For Each nListItem In .ListItems
With nListItem
For i = 2 To nColumnHeadersCount
If .SubItems(i) Like Find Then
nFound.Add Array(nListItem, i)
End If
Next 'i
End With
Next
Case lf5Both
nColumnHeadersCount = .ColumnHeaders.Count
For Each nListItem In .ListItems
With nListItem
If .Text Like Find Then
nFound.Add Array(nListItem, 1)
End If
For i = 2 To nColumnHeadersCount
If .SubItems(i) Like Find Then
nFound.Add Array(nListItem, i)
End If
Next 'i
End With
Next
End Select
Case lf5CompareText
Select Case FindIn
Case lf5Items
For Each nListItem In .ListItems
If LikeCompText(nListItem.Text, Find) Then
nFound.Add nListItem
End If
Next
Case lf5SubItems
nColumnHeadersCount = .ColumnHeaders.Count
For Each nListItem In .ListItems
With nListItem
For i = 2 To nColumnHeadersCount
If LikeCompText(.SubItems(i), Find) Then
nFound.Add Array(nListItem, i)
End If
Next 'i
End With
Next
Case lf5Both
nColumnHeadersCount = .ColumnHeaders.Count
For Each nListItem In .ListItems
With nListItem
If LikeCompText(.Text, Find) Then
nFound.Add Array(nListItem, 1)
End If
For i = 2 To nColumnHeadersCount
If LikeCompText(.SubItems(i), Find) Then
nFound.Add Array(nListItem, i)
End If
Next 'i
End With
Next
End Select
End Select
End With
Set ListViewFind5 = nFound
End Function
Da alle Tag-Eigenschaften ab Version 6 des ListView-Steuerelements auch Objekte aufnehmen können, hilft Ihnen die Funktion ListViewFindObjectInTags bei der Suche nach dem Element, dem Sie ein Objekt zugeordnet haben. Auch hier können Sie die ListItems alleine, die ListSubItems oder beide durchsuchen. Die Funktion gibt das erste gefundene Element zurück.
Public Function ListViewFindObjectInTags(ListView As ListView, _
Object As Object, _
Optional ByVal FindIn As ListViewFindInConstants = lfBoth) _
As Object
Dim nListItem As ListItem
Dim nListSubItem As ListSubItem
Select Case FindIn
Case lfItems
For Each nListItem In ListView.ListItems
With nListItem
If IsObject(.Tag) Then
Set ListViewFindObjectInTags = .Tag
Exit Function
End If
End With
Next
Case lfSubItems
For Each nListItem In ListView.ListItems
For Each nListSubItem In nListItem.ListSubItems
With nListSubItem
If IsObject(.Tag) Then
Set ListViewFindObjectInTags = .Tag
Exit Function
End If
End With
Next
Next
Case lfBoth
For Each nListItem In ListView.ListItems
With nListItem
If IsObject(.Tag) Then
Set ListViewFindObjectInTags = .Tag
Exit Function
End If
For Each nListSubItem In .ListSubItems
With nListSubItem
If IsObject(.Tag) Then
Set ListViewFindObjectInTags = .Tag
Exit Function
End If
End With
Next
End With
Next
End Select
End Function
|