Hallo Leute. Ich habe eine Liste, die ich mir in einem ListView in einer GUI anzeigen lasse. Ich habe mir nun einen kleinen Algorythmus gebaut, der eben diese Liste, bzw. das Array aus dem das ListView gespeist wird, durchsucht wird. Es kann durchaus vorkommen dass eine Suchanfrage mehrmals in der Liste gefunden wird. Die indicies der Suchergebnisse werden in einem weiteren Array gespeichert und ich möchte nun gerne alle Zeilen, in denen ein Suchergebnis gefunden wurde, markieren lassen. Wie kann ich das bewerkstelligen?
Automatische Mehrfachselektion im ListView
-
Scritch -
5. April 2018 um 13:02 -
Erledigt
-
-
- Offizieller Beitrag
Das kommt darauf an, wie Du die Suchtreffer markieren willst?
- Nur das normale markieren (Auswahl)?
- Farbe der Items ändern?
- Haken setzen (Listview mit Checkboxen)?
In jeden Fall wäre es aber hilfreich, wenn Du Dein Script postest und einen (Beispiel-)Datensatz.
-
Mein Code wäre der folgende. Der Anhang ist eine txt-Datei, die musst du als zur .csv umbennen und im gleichen Verzeichnis haben wie das Script. Eigentlich genügt eine normale Auswahl. Farbige Markierungen wären nett, aber nicht erforderlich.
C
Alles anzeigen#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <Array.au3> #include <createQRw.au3> #include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <File.au3> #include <GUIListView.au3> Global $pfad_qr_biler = @ScriptDir & "\QR-Code Bilder\" Dim $aDB_inhalt[1][3] Global $wert_input_seriennummer Global $wert_combo_geraetetyp Global $wert_input_info Global $qr_bild Global $datum = @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & "." & @MIN & "." & @SEC Global $acsv_tmp ; ein Array, in dem die eingelesene CSV-Datei (noch unformatiert) zwischengespeichert wird Global $aauswahl_fuer_kontext ; in dieses Array werden inhalte geschrieben, wenn etwas aus dem Listview in den Kontext übernommen wird Global $atmp_array_kontext ; enthält ein array, welches die Position des markierten Eintrags inm Listview enthält Global $auswahl ; enthält den Arrayeintrag der Varibalen $atmp_array_kontext Dim $asuchergebnisse[1][2] ; wenn eine Suche gestartet wird, beinhaltet dieses Array die Indicies der Suchergebnisse Global $wert_input_suche ; Varbiable in der der Wert gespeichert wird, der in dem Suchfeld eingegeben wurde _FileReadToArray(@ScriptDir & "\test.csv", $acsv_tmp) #Region ### START Koda GUI section ### Form=c:\users\ihangebr\desktop\inventarisierung\inventarisierung.kxf $form_inventarisierung = GUICreate("Inventarisierung v1.0", 1090, 543, 387, 230) GUISetBkColor(0xB9D1EA) $input_suche = GUICtrlCreateInput("Suche", 8, 8, 257, 21) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $group_bearbeitung = GUICtrlCreateGroup("BEARBEITUNG", 368, 8, 225, 193) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") GUICtrlSetColor(-1, 0x000000) $input_seriennummer = GUICtrlCreateInput("Seriennummer", 385, 28, 190, 21) $btn_neuer_posten = GUICtrlCreateButton("Neuen Posten anlegen", 383, 115, 190, 33) $input_info = GUICtrlCreateInput("Standort oder Mitarbeiter", 384, 83, 190, 21) $combo_geraetetyp = GUICtrlCreateCombo("Gerätekategorie", 384, 56, 190, 40, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Desktop PC|Settop PC|Kleinstrechner|Notebook|Smartphone|Mobiles Telefon|Stationäres Telefon|TFT-Monitor 24" & Chr(34) & "|TFT-Monitor sonstige") $btn_aendern = GUICtrlCreateButton("Änderungen übernehmen", 383, 153, 190, 33) GUICtrlCreateGroup("", -99, -99, 1, 1) $list_datenbankinhalt = GUICtrlCreateListView("", 8, 32, 353, 435) $Group3 = GUICtrlCreateGroup("LOG", 832, 8, 233, 201) GUICtrlSetFont(-1, 8, 800, 0, "Arial") $list_log = GUICtrlCreateListView("", 842, 27, 217, 174) GUICtrlCreateGroup("", -99, -99, 1, 1) $btn_suchen = GUICtrlCreateButton("Suchen", 270, 6, 91, 25) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $btn_in_kontext = GUICtrlCreateButton("Auswahl in Kontext übernehmen", 8, 472, 195, 33) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $btn_loeschen = GUICtrlCreateButton("Auswahl löschen", 204, 472, 155, 33) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $group_qr_code = GUICtrlCreateGroup("QR-Code", 600, 8, 225, 329) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $pic_qr_code = GUICtrlCreatePic("C:\Users\ihangebr\Desktop\inventarisierung\beispielcode.JPG", 613, 104, 200, 200) $label_qr_inhalt = GUICtrlCreateLabel("Beispielcode", 610, 310, 206, 20, $SS_CENTER) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetBkColor(-1, 0xFFFFFF) $btn_speichere_qr = GUICtrlCreateButton("QR-Code speichern", 613, 64, 190, 33) $btn_generiere_qr = GUICtrlCreateButton("QR-Code generieren", 612, 28, 190, 33) GUICtrlCreateGroup("", -99, -99, 1, 1) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### _erstelle_spalten() _csv_2_array() ; muss nach dem erstellen aller GUI-Elemente ausgeführt werden, da es sonst Probleme mit dem ListView gibt! While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $btn_neuer_posten _neuer_posten() Case $btn_generiere_qr _qr_code_generieren() Case $btn_speichere_qr _qr_speichern() Case $btn_loeschen _eintrag_loeschen() Case $btn_aendern _eintrag_aendern() Case $btn_in_kontext _in_kontext_ubernehmen() Case $btn_suchen _suchen() EndSwitch WEnd Func _ausgewaehltes_item() $atmp_array_kontext = _GUICtrlListView_GetSelectedIndices($list_datenbankinhalt, True) ; Liest welcher Eintrag selektiert wurde und schreibt diesen in ein Array. In Zeile 1 steht die Nummer des selektierten Eintrags $auswahl = $atmp_array_kontext[1] EndFunc ;==>_ausgewaehltes_item Func _in_kontext_ubernehmen() ; von dem markierten Objekt werden die Inhalte in die Inputfelder geschrieben _ausgewaehltes_item() $aauswahl_fuer_kontext = _GUICtrlListView_GetItemTextArray($list_datenbankinhalt, $auswahl) ; wenn der eintrag markiert wurde dann wird hiermit der Inhalt der markierten Zeile ausgelesen. Es wird ein Array ausgegeben dessen erste Zeile uninteressant ist, da dort geschrieben steht, wieviele Zeilen das Array lang ist. GUICtrlSetData($input_seriennummer, $aauswahl_fuer_kontext[1]) ; Fügt die Einträge des Arrays den Controls hinzu. Der Inhalt der Controls wird hierbei angepasst und verändert GUICtrlSetData($combo_geraetetyp, $aauswahl_fuer_kontext[2]) GUICtrlSetData($input_info, $aauswahl_fuer_kontext[3]) _qr_code_generieren() EndFunc ;==>_in_kontext_ubernehmen Func _eintrag_aendern() _werte_abfragen() _ausgewaehltes_item() ; muss noch komplettiert werden EndFunc ;==>_eintrag_aendern Func _suchen() _werte_abfragen() Dim $asucharray_tmp ;definiert ein lokales temporäres Sucharray. Ausdiesem Array werden später die Daten in das finale Array geschrieben For $i = 0 To 3 - 1 $asucharray_tmp = _ArrayFindAll($aDB_inhalt, $wert_input_suche, 0, UBound($aDB_inhalt), 0, 1, $i, 0) ; findet alle Scuhergebnisse im Array und schreibt die Indicies, wo die Suchergebnisse gefunden wurden, in eine separates Array If @error Then ;Hier kann evt. ein Log-Eintrag erfolgen ;~ MsgBox(1, "Keine Suchergebnisse", "In Spalte " & $i & " ergab die Suche keine Treffer.") Else For $j = 0 To UBound($asucharray_tmp) - 1 $asuchergebnisse[UBound($asuchergebnisse) - 1][0] = $asucharray_tmp[$j] ; schreibt den Inhalt des temporären Sucharray für Spalte n in das finale Sucharray $asuchergebnisse[UBound($asuchergebnisse) - 1][1] = $i ; schreibt den Inhalt des temporären Sucharray für Spalte n in das finale Sucharray ReDim $asuchergebnisse[UBound($asuchergebnisse) + 1][2] Next EndIf Next _ArrayDisplay($asuchergebnisse) For $i = 0 To 40 - 1 ;suchergebnisse in liste markieren _GUICtrlListView_SetItemSelected($list_datenbankinhalt, $i) Sleep(800) Next ;~ ReDim $asucharray_tmp[1] ReDim $asuchergebnisse[1][2] ;arrays leeren EndFunc ;==>_suchen Func _neuer_posten() ; fügt einen neuen posten in einer neuen zeile dem array hinzu _werte_abfragen() $aDB_inhalt[UBound($aDB_inhalt) - 1][0] = $wert_input_seriennummer $aDB_inhalt[UBound($aDB_inhalt) - 1][1] = $wert_combo_geraetetyp $aDB_inhalt[UBound($aDB_inhalt) - 1][2] = $wert_input_info ReDim $aDB_inhalt[UBound($aDB_inhalt) + 1][3] _listview_update() EndFunc ;==>_neuer_posten Func _qr_code_generieren() _werte_abfragen() _createQRw_($wert_input_seriennummer, $pic_qr_code, @ScriptDir & '\~QR_mesale0077.bmp') ; generiert den QR-Code und zeigt ihn im Bereich des Bildes an GUICtrlSetData($label_qr_inhalt, $wert_input_seriennummer) ; Passt den Inhalt des Labels an EndFunc ;==>_qr_code_generieren Func _qr_speichern() _werte_abfragen() $qr_bild = _ScreenCapture_Capture("", 295, 438, 492, 658) ; Definiert den Bereich, von dem ein Bild gemacht werden soll. Beschränkt wird sich hierbei auf den Bereich, wo der QR-Code ist und dessen beschreibung _ScreenCapture_SaveImage(@ScriptDir & "\QR-Code Bilder\" & $wert_combo_geraetetyp & "_" & $wert_input_seriennummer & "_" & $datum & ".jpg", $qr_bild) ;Speichert das Bild unter einem spezifischen namen ab EndFunc ;==>_qr_speichern Func _werte_abfragen() ; in dieser Funktion werden alle Werte aller Controls abgefragt, wo Benutzereingaben getätigt werden können $wert_input_seriennummer = GUICtrlRead($input_seriennummer) $wert_combo_geraetetyp = GUICtrlRead($combo_geraetetyp) $wert_input_info = GUICtrlRead($input_info) $wert_input_suche = GUICtrlRead($input_suche) EndFunc ;==>_werte_abfragen Func _listview_update() ; updated das LisView wenn Änderungen am Array und damit dem ListView vorgenommen wurden _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($list_datenbankinhalt)) _GUICtrlListView_AddArray($list_datenbankinhalt, $aDB_inhalt) EndFunc ;==>_listview_update Func _erstelle_spalten() ;erstellt die Spalten mit Größe und bezeichnung für die ListViews _GUICtrlListView_AddColumn($list_datenbankinhalt, "Seriennummer", 100) _GUICtrlListView_AddColumn($list_datenbankinhalt, "Typ", 100) _GUICtrlListView_AddColumn($list_datenbankinhalt, "Info", 56) EndFunc ;==>_erstelle_spalten Func _eintrag_loeschen() ; löscht den markierten Eintrag aus dem Array _ausgewaehltes_item() _ArrayDelete($aDB_inhalt, $auswahl) _listview_update() EndFunc ;==>_eintrag_loeschen Func _csv_2_array() ; Konvertiert eine eingelesene CSV-Datei in ein Array Local $atmp ; temporäres Array, in dem der Inhalt des gesplitteten Strings zwischengespeichert wird For $i = 0 To UBound($acsv_tmp) - 1 ; $atmp = StringSplit($acsv_tmp[$i], ";") For $j = 1 To UBound($atmp) - 1 $aDB_inhalt[$i][$j - 1] = $atmp[$j] ; speichert jede zeile aus $atmp in jede spalte von $aDB_inhalt Next ReDim $aDB_inhalt[UBound($aDB_inhalt) + 1][3] Next _ArrayDelete($aDB_inhalt, 0) ;in der ersten Zeile des Arrays wird die Anzahl der Zeilen mit dargestellt. Dieser Ausdruck löscht diesen Eintrag _listview_update() EndFunc ;==>_csv_2_array
-
- Offizieller Beitrag
Wenn Du nur im sichtbaren Listview suchen willst, ist das mit "_GUICtrlListView_FindInText" viel einfacher. Ändere mal Deine Funktion "_suchen()" in diese:
AutoItFunc _suchen() _werte_abfragen() _GUICtrlListView_SetItemSelected($list_datenbankinhalt, -1, False) Local $iIndex = -1 Do $iIndex = _GUICtrlListView_FindInText($list_datenbankinhalt, $wert_input_suche, $iIndex, False) If $iIndex > -1 Then _GUICtrlListView_SetItemSelected($list_datenbankinhalt, $iIndex) Until $iIndex = -1 EndFunc
Nachtrag: Du musst noch die Mehrfachselektion beim Listview erlauben:
-
Klappt, perfekt, vielen Dank!