ListView für Fortgeschrittene Verfasst am: 15.06.2009, 11:12
Thema: ListView für Fortgeschrittene
Heute möchte ich euch das ListView noch etwas näher bringen. Beschäftigen werden wir uns mit diesen Funktionen:
1. Über eine Schleife Einträge machen 2. Einen bestimmten Eintrag finden. 3. Über eine Schleife Einträge löschen 4. Fehler verhindern 5. Mausklicks auswerten 6. Tastendruck auswerten
Als erstes erstellt ihr mal ein ListView mit einer Spalte und der Ansicht lvwReport. Damit es etwas einfacher ist, nenne ich das ListView einfach „lv“. Hier ein code den wir für alle Beispiele brauchen werden. Ich werde diesen später nicht mehr schreiben.
Code:
Option Explicit<br />Option Base 1<br /><br />Private buffer(10) As String<br />Private i As Integer<br /><br />Private Sub Form_Load()<br />buffer(1) = "Kevin"<br />buffer(2) = "Michael"<br />buffer(3) = "Joachim"<br />buffer(4) = "Benjamin"<br />buffer(5) = "Phillip"<br />buffer(6) = "Thomas"<br />buffer(7) = "Dennis"<br />buffer(8) = "David"<br />buffer(9) = "Daniel"<br />buffer(10) = "Dieter"<br />End Sub
Mit Option Base 1 legen wir fest, das alle Arrays mit 1 anfangen und nicht mit 0. Muss man nicht machen, ist in Verbindung mit einem ListView aber etwas praktischer, da das ListView im Gegensatz zur Listbox auch mit 1 anfängt.
Danach deklarieren wir uns ein Array, wo wir ein paar Namen eintragen, die wir dann in die Liste schreiben. Ob ihr die Namen aus einer Wordlist auslest, oder sie von irgendwo anders besorgt ist euch überlassen. Die Variable i brauchen wir für die For Schleife.
1. Über eine Schleife Einträge machen.
Das ist eigentlich sehr einfach.
Code:
For i = 1 To 10<br /> lv.ListItems.Add , , buffer(i)<br />Next i
Die Schleife läuft jetzt von 1 bis 10 durch. Die Variable i erhöht sich immer um eins, also wird buffer(1) bis buffer(10) in die Liste eingetragen.
Im ersten Teil des Tutorials hab ich schon gezeigt wie man vorgeht wenn man mehrere Spalten hat und in alle etwas eintragen möchte. Hier nochmal ein code dazu mit Schleife.
Code:
Dim list as Listitem<br />For i = 1 To 10<br /> Set List = lv.ListItems.Add(, , buffer(i)) <br /> With List<br /> .SubItems(1) = "Spalte 2"<br /> .SubItems(2) = "Spalte 3" <br /> End With<br />Next i<br />Set list = nothing
2. Einen bestimmten Eintrag finden. Jetzt wollen wir mal nach einen bestimmten Eintrag suchen. Das ist natürlich wichtig, falls ihr in weiteren Spalten zu diesem Eintrag wichtige Information habt, die ihr auslesen möchtet.
Code:
For i = 1 To lv.ListItems.Count<br /> If StrComp(lv.ListItems(i).Text, "David" , vbTextCompare) = 0 Then<br /> Call MsgBox("David ist an der Stelle " & i & " in der Liste.", vbInformation, "David gefunden")<br /> End If<br />Next i
Wir benutzen also wieder eine Schleife um jeden Eintrag zu überprüfen. Dieses Mal läuft die Schleife nicht von 1 bis 10, sondern von 1 bis lv.Listitems.Count. Wer nicht weiß was Count bedeutet sollte jetzt in einem Wörterbuch nachsehen. So ist also gewährleistet, dass die Schleife bis zum letzten Eintrag durchläuft, egal wie viele in der Liste sind. Als nächstes fällt euch vielleicht der Befehl „StrComp“ auf. Hier wird der Text in der Zeile mit dem Text „David“ verglichen und falls sie gleich sind, wird eine Message ausgegeben. Ich hätte hier auch einfach If lv.Listitems(i).Text = „David“ schreiben können, aber der Aufruf StrComp ist deutlich schneller und deswegen vorzuziehen.
Außerdem fällt euch vielleicht das i in der Klammer nach lv.Listitems auf. Mit i geben wir einfach die Zeilennummer an, die wir überprüfen wollen.
Man kann auch in anderen Spalten suchen. Dann muss die If Abfrage etwa so aussehen.
Code:
If StrComp(lv.ListItems(i).SubItems(1), "David" , vbTextCompare) = 0 Then<br /><br />End If
SubItems(1) entspricht der zweiten Spalte, SubItems(2) der dritten und so weiter.
3. Über eine Schleife Einträge löschen.
Nun wollen wir Einträge wieder löschen. Wenn ihr die komplette Liste leeren wollt geht das einfach mit:
Code:
lv.ListItems.Clear
Jetzt wollen wir aber nur markierte Einträge aus der Liste löschen. Dazu müßt ihr in den Eigenschaften des ListViews die Options Multiselect aktivieren.
Code:
For i = lv.ListItems.Count To 1 Step -1<br /> If lv.ListItems(i).Selected = True Then lv.ListItems.Remove i<br />Next i
So werden alle markierten Zeilen aus der Liste entfernt. In diesem Fall läuft die Schleife aber rückwärts, weil es sonst zu einem Fehler kommen würde. Stellt euch das so vor. Count ist sagen wir 10 und wir versuchen jede Zeile von 1 bis 10 zu überprüfen. Nun löschen wir aber markierte Zeilen raus, was bedeutet dass nicht mehr 10 Zeilen in der Liste sind und so wird es zu einem Fehler kommen wenn wir eine Zeile überprüfen wollen die nicht mehr existiert. Auf Step -1 dürft ihr nicht vergessen, da die Schleife sonst nicht rückwärts läuft.
In der If Abfrage wird überprüft ob die Zeile markiert (selected) ist oder nicht und dann gegebenenfalls gelöscht.
4. Fehler verhindern.
Naja. Einen Fehler haben wir ja schon verhindert in dem wir die For Schleife zum löschen rückwert laufen lassen. Aber wo können noch Probleme auftreten. Besonders welche die der spätere Benutzer auslösen könnte.
Z.B. Die Suchfunktion eines Eintrages. Wenn ihr eine Textbox nutzt, wo der Benutzer ein Wort eingeben kann zum suchen, solltet ihr vorher abfragen ob er überhaupt etwas eingeben hat. Am besten so:
Code:
If Len(Text1.Text) <> 0 Then<br /><br />End if
So wird überprüft ob Text1.Text länger als null ist. Das ist um einiges schneller als if Text1.Text = ““ Then. Dieselbe Abfrage sollte auch beim einfügen in die Liste sein.
5. Mausklicks auswerten. Normale Klicks wie DoubleClick und Click auszuwerten ist kein Problem.
Code:
Private Sub lv_DblClick()<br />Call MsgBox(lv.SelectedItem.Text)<br />End Sub
Wie ihr seht steht hier jetzt lv.SelectedItem.Text und nicht lv.ListItems… Unter der Option SelectedItems wird uns die zur Zeit markierte Zeile übergeben.
Nun bieten wir hier aber die Möglichkeit mehrere Zeilen zu markieren. Mit den oberen code bekommen wir nur die zuletzt markierte Zeile angezeigt. Hier müssen wir wieder eine Schleife benutzen.
Code:
For i = 1 to lv.Listitems.Count<br /> If lv.ListItems(i).Selected = True Then <br /> Call MsgBox(lv.Listitems(i).Text)<br /> End If<br /> Next i
6. Tastendruck auswerten. Ist ebenfalls sehr einfach.
Code:
Private Sub lv_KeyPress(KeyAscii As Integer)<br />If KeyAscii = vbKeyReturn Then<br /> Call MsgBox(lv.SelectedItem.Text)<br />End If<br />End Sub
Hier wird einfach überprüft ob die Taste „Enter“ gedrückt wurde und gegebenenfalls eine Message ausgegeben. Leider kann man so nicht alle Tasten abfragen.
So. Das war es mal wieder. Im nächsten Teil werde ich die folgenden Dinge erläutern.
1. Tasten wie F1 oder Entf im ListView Abfragen 2. Rechte Maustaste im ListView auswerten 3. Listeneinträge verschieben 4. Einträge von einem ListView zum anderen verschieben 5. Einträge sortieren 6. Suche, mit nur teilweise bekannten Wörtern. Z.B (K*e*v*n) 7. Bei Eingabe eines Buchstaben soll passende Wörter angezeigt werden die mit diesen anfangen.
Also. Have fun.
mfg, ZiG _________________
Belie Newbie
Anmeldedatum: 05.09.2011 Beiträge: 1
Verfasst am: 05.09.2011, 09:15
Hallo,
ich habe nach deinem Beispiel einen Text im Listview gesucht. Diesen möchte ich jetzt rot färben:
For i = 1 To UserFormList.ListView1.ListItems.Count
If StrComp(UserFormList.ListView1.ListItems(i).SubItems(7), "***Auftrag", vbTextCompare) = 0 Then
UserFormList.ListView1.ListItems(i).ForeColor = vbRed