[Text] ListView für Fortgeschrittene Verfasst am: 26.03.2007, 23:09
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.
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
lv.ListItems.Add , , buffer(i)
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
For i = 1 To 10
Set List = lv.ListItems.Add(, , buffer(i))
With List
.SubItems(1) = "Spalte 2"
.SubItems(2) = "Spalte 3"
End With
Next i
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
If StrComp(lv.ListItems(i).Text, "David" , vbTextCompare) = 0 Then
Call MsgBox("David ist an der Stelle " & i & " in der Liste.", vbInformation, "David gefunden")
End If
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
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
If lv.ListItems(i).Selected = True Then lv.ListItems.Remove i
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
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()
Call MsgBox(lv.SelectedItem.Text)
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
If lv.ListItems(i).Selected = True Then
Call MsgBox(lv.Listitems(i).Text)
End If
Next i
6. Tastendruck auswerten.
Ist ebenfalls sehr einfach.
Code:
Private Sub lv_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
Call MsgBox(lv.SelectedItem.Text)
End If
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 _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Zuletzt bearbeitet von ZiG_ am 23.05.2007, 12:45, insgesamt einmal bearbeitet
413X_ « Moderator »
Anmeldedatum: 16.12.2006 Beiträge: 266
Verfasst am: 02.04.2007, 12:40
So ich darf das Thema nun fortfuehren mit der Erlaubnis von ZiG
Ok dann gehts direkt mal los:
1. Tasten im ListView abfragen
Wenn ihr zB einen Eintrag beim Tastendruck von "Entfernen/Delete" loeschen wollt, macht ihr das mit diesem Code:
[code]
Private Sub ListView1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim i As Integer
If KeyCode = 46 Then 'Wenn Entfernen = 46 gedrueckt wird
For i = ListView1.ListItems.Count To 1 Step -1 'Jedes Item der Listview rueckwaerts durchgehen
If ListView1.ListItems(i).Selected = True Then 'Wenn das Item markiert ist, dann
ListView1.ListItems.Remove i 'Item loeschen
End If
Next i
End If
End Sub
[/code]
2. Rechte Maustaste im ListView auswerten
[code]
Private Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then 'Bei Rechtsklick = 2
MsgBox "Es wurde die rechte Maustaste auf dem Punkt (" & x & " | " & y & ") geklickt."
End If
End Sub
[/code]
Die weiteren Punkte mache ich wahrscheinlich spaeter noch weiter, denn auch ich habe noch ein Leben _________________ http://www.413x.dl.am
Tod den 1337-Scriptkiddies xD
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 02.04.2007, 13:03
Den Code mit der rechten Maustaste sollte man noch erweitern, da man so nicht unterscheiden kann ob ins leere gedrückt wurde oder auf einen Eintrag und da es bei dem obigen code auch zu Problemen kommen kann.
[code]
Private Sub lv_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
If Button = 2 Then
With lv
Set list = .HitTest(x, Y)
If Not list Is Nothing Then
Set .SelectedItem = .ListItems(list.Index)
'code
Else
'code
End If
End With
End If
Set list = Nothing
End Sub
[/code]
Den hab ich irgendwo von vbarchiv oder activevb.
mfg, ZiG _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Blue!Sky!_ Coder
Anmeldedatum: 06.10.2007 Beiträge: 227
Verfasst am: 10.11.2007, 18:41
Danke euch beiden---...--- _________________
big earl_ Coder
Anmeldedatum: 11.05.2007 Beiträge: 208
Verfasst am: 10.11.2007, 19:59
Könnte vllt einer von euch beiden noch ein TUT oä machen um zu Testen das überhaubt etwas in der List steht ?
denn es kommen zuviele errors nur weil die datei nicht existiert
Blue!Sky!_ Coder
Anmeldedatum: 06.10.2007 Beiträge: 227
Verfasst am: 10.11.2007, 20:40
On error goto 10
fddfdfdf
10
is doch nich so schwer
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 10.11.2007, 20:46
@big earl
Iwie kapier ich nicht was du meinst.
Willst du jetzt überprüfen ob die Liste leer ist, oder ob eine Datei existiert?
Liste leer?
Code:
if ListView1.Listitems.count = 0 then
File existiert?
Code:
Public Function FileExists(ByVal FileName As String) As Boolean
On Local Error Resume Next
FileExists = (Dir$(FileName) <> "")
End Function
_________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Primal_ Newbie
Anmeldedatum: 23.02.2008 Beiträge: 19
Verfasst am: 10.03.2008, 16:35
Kann vielleicht jemand nen Code zum speichern der ganzen Listview tabelle hier posten
man sollte sie dann auch wieder laden können
Bitte
MfG Primal _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 10.03.2008, 16:56
Hier werden tutorials gepostet und nicht sources gesammelt.
Außerdem wurde das Thema schon paarmal besprochen. Sufu hilft also weiter. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)