ListView: Jeden Eintrag einmal ansprechen?

Nabend zusammen,

gibt es eine „optimale“ Lösung, um bei einem ListView-Element jeden Eintrag einmal anzusprechen? Ich habe das bisher wie folgt gemacht:

For i = 1 to ListView1.ListItems.Count
MsgBox ListView1.ListItems.Item(i).Index
Next i

Problem: Wenn ein Eintrag mittendrin entfernt wurde - was ich ja jederzeit tun kann - dann endet das in einem Indexfehler. Habe ich zum Beispiel grad den Eintrag mit dem Index 19 gelöscht, dann kann er diesen logischerweise in der MsgBox nicht anzeigen, weil es ihn nicht gibt => Indexfehler.

Möglichkeit wäre jetzt, vorher abzufragen, ob der Index auch existiert. Falls mir jemand verraten könnte, wie das geht, wäre ich sehr dankbar. Ich denke jedoch, dass es das grundsätzliche Problem nicht löst, oder doch?

Nehmen wir an, die ListView hat 20 Einträge … 1 bis 22, und in der Mitte fehlen die Einträge 18 und 19. Dann würde die oben genannte Schleife nur von 1-20 durchrennen - bei 18 und 19 gäbe es Indexfehler und 21/22 würden ganz ignoriert.

Das kann’s ja nicht sein … oder ist die Funktionsweise anders?

Grüße
Lars

Hallo Lars,

so richtig schlau werde ich aus deinem Posting nicht :frowning:
Aber was mir auffaellt :wink:
Du kannst dem Listview keinen Index zuweisen, da die Eigenschaft schreibgeschuetzt ist! Wenn du das versuchst, so tritt ein Laufzeitfehler auf. Den kann man zwar mit On Error Resume next weglutschen, aber ist ja nicht das wahre :wink:
Du kannst beim Hinzufügen der Einträge einen Sogenannten Schluessel vergeben, anhand dessen du den Eintrag identifizieren kannst :smile:

Aber wozu eigentlich? Nunja ich poste dir im Anhang mal ein Beispiel wo du es siehst :smile:

Zu deinem Problem nun. Wenn du jeden Eintrag nur einmal durchlaufen möchtest, so hast du ja bereits die Lösung präsentiert :smile:
Wie das Geht das siehst du auch in dem Beispiel :smile:

Wenn ich nun total daneben liege, so gebe nochmal bescheid, was du genau machen möchtest und wo dein problem dabei liegt :smile:

Zu dem Beispiel:

Nimm eine Form und platziere folgende Steuerelmente darauf
Ein Listview -> Name Listview1
4 Schaltflächen
Command1 -> Caption = Neu füllen
command2 -> Caption = Entfernen
command3 -> Caption = Beenden
command4 -> Caption = Alle Einträge durchlaufen und Key anzeigen

Dann kopiere dir mal folgenden Code in die Form und starte sie und probiere mal ein wenig aus. Dann siehst du wie das Steuerelement fungiert. Bei Klick auf Command 4 werden alle Eintraege im Listview durchlaufen und du bekommst den jeweiligen Key , sowie die Daten dazu in einer MSGBOX angezeigt :smile: Ein Klick auf Command 2 Entfernt die Selektierten Eintrag in der Liste. Command 3 hingegen beendet die Form und über Command 1 kannst du schnell x beliebige Eintraege generieren :smile:

Option Explicit

Private Sub Command1\_Click() 'Neu füllen
On Error Resume Next 'Wenn bei Inputbox ein Zeichen eingegeben wird so tritt Fehler auf, ergo weglutschen
Dim lngAnzahl As Long
lngAnzahl = CLng(InputBox("Wieviele Einträge möchten Sie erzeugen?", "Anzahl der Einträge", 30))
If lngAnzahl \> 0 Then
Call FülleListView(lngAnzahl)
Else
MsgBox "Sie müssen schon angeben, wieviele Einträge Sie generieren wollen!", vbCritical
End If
End Sub

Private Sub Command2\_Click() 'Selectierten Eintrag entfernen
ListView1.ListItems.Remove (ListView1.SelectedItem.Index)
End Sub

Private Sub Command3\_Click() 'Beenden
Unload Me
End
End Sub

Private Sub FülleListView(Anzahl As Long) 'Listview wird gefuellt
Dim i As Byte
Dim j As Long
With ListView1
'ListView füllen mit Eintraegen
For j = 1 To Anzahl
.ListItems.Add j, "Eintrag" & CStr(j), "Eintrag " & CStr(j) & " in Spalte 1"
'4 Subitems eintragen
For i = 1 To 4
.ListItems(j).SubItems(i) = "Eintrag " & CStr(j) & " in Spalte " & CStr(i + 1)
Next i
'Ein 5 Subitem eintragen, das dir den Schluessel anzeigt
.ListItems(j).SubItems(5) = "Eintrag" & CStr(j)
Next j
End With
End Sub

Private Sub Command4\_Click() 'Anzeigen aller Einträge
Dim i As Long
For i = 1 To ListView1.ListItems.Count
MsgBox "Schlüssel: " & ListView1.ListItems(i).Key & vbNewLine \_
& "Spalte1: " & ListView1.ListItems(i) & vbNewLine \_
& "Spalte2: " & ListView1.ListItems(i).SubItems(1) & vbNewLine \_
& "Spalte3: " & ListView1.ListItems(i).SubItems(2) & vbNewLine \_
& "Spalte4: " & ListView1.ListItems(i).SubItems(3) & vbNewLine \_
& "Spalte5: " & ListView1.ListItems(i).SubItems(4) & vbNewLine \_
& "Spalte6: " & ListView1.ListItems(i).SubItems(5) & vbNewLine

Next i
End Sub

Private Sub Form\_Load()
With ListView1
'Eigenschaften des Listview setzen
.View = lvwReport
.HideSelection = False
.HideColumnHeaders = False
'Spalten erstellen
.ColumnHeaders.Add , , "Spalte 1"
.ColumnHeaders.Add , , "Spalte 2"
.ColumnHeaders.Add , , "Spalte 3"
.ColumnHeaders.Add , , "Spalte 4"
.ColumnHeaders.Add , , "Spalte 5"
.ColumnHeaders.Add , , "Index"
End With
End Sub

ich hoffe dir ein wenig Licht ins Dunkel gebracht zu haben :smile:

MfG Alex