|
Wie eine ListBox bietet das ListView-Steuerelement aus den
Microsoft Common Controls auch die Einstellung MultiSelect an. Eine
SelCount-Eigenschaft wie bei der ListBox ist jedoch nicht vorhanden.
Mit einer über die API-Funktion SendMessage
an das ListView-Steuerelement gesendete Nachricht
LVM_GETSELECTEDCOUNT können Sie jedoch die Anzahl der gewählten
Elemente jederzeit ermitteln:
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Function ListViewSelCount(ListView As ListView) As Long
Const LVM_GETSELECTEDCOUNT = &H1032
ListViewSelCount = SendMessage(ListView.hwnd, _
LVM_GETSELECTEDCOUNT, 0&, 0&)
End Function
Über die Nachricht LVM_GETSELECTIONMARK können Sie den Index
des ersten gewählten ListItems in Erfahrung bringen. Da abweichend
von der Index-Handhabung in Visual Basic der Index bei 0 beginnend
gezählt wird, ist der Rückgabewert um 1 zu erhöhen. Da aber nicht
nur für das erste ListItem der Rückgabewert 0 ist, sondern auch 0
zurückgegeben wird, wenn gar kein ListItem ausgewählt ist, muss
zuvor die Anzahl der gewählten Elemente ermittelt werden.
Public Function ListViewSelStartIndex(ListView As ListView) _
As Long
Dim nListViewSelStartIndex As Long
Const LVM_GETSELECTIONMARK = &H1042
nListViewSelStartIndex = SendMessage(ListView.hwnd, _
LVM_GETSELECTIONMARK, 0&, 0&)
If ListViewSelCount(ListView) Then
ListViewSelStartIndex = nListViewSelStartIndex + 1
End If
End Function
Die folgende Variante derselben Funktion gibt nicht den Index,
sondern gleich das betreffende ListItem zurück:
Public Function ListViewSelStartItem(ListView As ListView) _
As ListItem
Dim nListViewSelStartIndex As Long
Const LVM_GETSELECTIONMARK = &H1042
nListViewSelStartIndex = SendMessage(ListView.hwnd, _
LVM_GETSELECTIONMARK, 0&, 0&)
If ListViewSelCount(ListView) Then
Set ListViewSelStartItem = _
ListView.ListItems(nListViewSelStartIndex + 1)
End If
End Function
Nun fehlt nur noch eine Auflistung bzw. Sammlung (Collection) der
markierten Elemente. Hier bietet das API keine Unterstützung. Sie
müssen bei jedem einzelnen ListItem prüfen, ob es gewählt ist,
und es dann in eine neue Collection einfügen. Damit bei einer
großen Anzahl von ListItems die ListItems-Collection nicht unnötig
durchlaufen werden muss, falls gar kein ListItem gewählt ist, wird
auch hier anhand der Anzahl unterschieden. Sie können beim
Zusammenstellen der Collection dafür sorgen, dass die Auswahl der
zuvor gewählten ListItems sogleich aufgehoben wird, indem Sie im
optionalen Parameter Unselect den Wert True übergeben.
Public Function ListViewSelectedItems(ListView As ListView, _
Optional ByVal Unselect As Boolean) As Collection
Dim nSelectedItems As Collection
Dim nListItem As ListItem
Set nSelectedItems = New Collection
If ListViewSelCount(ListView) Then
With nSelectedItems
On Error Resume Next
For Each nListItem In ListView.ListItems
If nListItem.Selected Then
If Unselect Then
nListItem.Selected = False
End If
.Add nListItem, nListItem.Key
If Err.Number Then
Err.Clear
.Add nListItem
End If
End If
Next 'i
End With
End If
Set ListViewSelectedItems = nSelectedItems
End Function
Wollen Sie die Auswahl erst später aufheben, ist das auch kein
Problem. Die folgende Prozedur sorgt dafür, wenn Sie ihr die zuvor
gewonnene Collection übergeben:
Public Sub ListViewUnselectItems(SelectedItems As Collection)
Dim nListItem As ListItem
For Each nListItem In SelectedItems
nListItem.Selected = False
Next
End Sub
|