Listview Sortierung (geht/geht nicht)

  • Hallo,

    ich habe ein Problem beim Sortieren der Listview

    Dieses Beispiel klappt:

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 250)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 24, 72, 798, 626)
    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 400)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)
    GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #EndRegion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Ich entferne nun diese Einträge

    Spoiler anzeigen
    [autoit]


    GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)

    [/autoit]


    ...und Trage die Werte per Loop ein!
    Wenn ich nun per Array die Listview fülle,
    dann werden die Werte alle in die Listview eingetragen
    es läßt sich aber nichts sortieren!

    [autoit][/autoit][autoit][/autoit][autoit]

    ;.....
    If IsArray($aTiere) Then
    $d = $aTiere[$i]&"|"&$aTiere[$i + 1]&"|"&$aTiere[$i + 2]&""&"|"&$i

    [/autoit][autoit][/autoit][autoit]

    GUICtrlCreateListViewItem($d, $Listview1)

    EndIf
    next

    [/autoit][autoit][/autoit][autoit]

    ;Die Listview wird korrekt gefüllt!
    ;Die Spaltenköpfe zeigen auch den Sortierungsbutton

    [/autoit]

    also, das klappt alles, aber die Sortierung geht nicht!

    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (23. Juni 2011 um 14:13)

  • Hi!


    Ich habe dein beispiel getestet "Funktioniert"

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLi

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 250)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 24, 72, 798, 626)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 400)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    ;GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    ;GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #endregion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 32 To 54
    $aLi = Chr(Random(32, $i, 1)) & '|' & Chr(Random(32, $i, 1)) & '|' & Chr(Random(98, $i, 1))
    GUICtrlCreateListViewItem($aLi, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit]


    Lg Kleiner

  • Guten Morgen Kleiner,

    konnte mich gestern Abend nicht mehr melden.
    Leider stimmt die Sortierung nicht.

    Ich habe mal die Listview gefüllt:

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLi

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 500)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 24, 72, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 400)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    ;GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    ;GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #endregion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 30
    $aLi = $i &" Nr."& '|'
    GUICtrlCreateListViewItem($aLi, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit]

    Die Nr. stimmen am Anfang.
    Klickt man auf sortieren, dann stimmt die Sortierung nicht mehr.

    Grüße
    Ilse ;)

  • Hi IIse.


    Die gezeigte Situation ist kein fehler, wenn du die darstellung (Sortierung) ader haben willst, schrieb dein eigenen Algorithmus.

    Lg Kleiner

    • Offizieller Beitrag

    Wenn die Inhalte alphanumerisch sind, wird auch entsprechend sortiert (1, 10, 2 ...).
    Also trenne einfach den numerischen Teil in eine eigene Spalte ab, dann klappt auch die Sortierung.

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLi

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 500)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Nr|Spalte1|Spalte2|Spalte3", 24, 72, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 40)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 3, 75)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    ;GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    ;GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #endregion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 30
    $aLi = $i & '|' & '|' & '|'
    GUICtrlCreateListViewItem($aLi, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit]
  • Hallo Bugfix,

    konnte mich gestern nicht mehr melden.
    Hab das ganze probiert.
    Aber was mache ich wenn die Spalte z.B. so aussieht:

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLi

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 500)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Nr|Spalte1|Spalte2|Spalte3", 24, 72, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 40)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 3, 75)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    ;GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    ;GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #endregion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 30
    $aLi = $i&",20" & '|' & '|' & '|'
    GUICtrlCreateListViewItem($aLi, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit]

    Dann stimmt das leider nicht mehr.
    Gibt es da vielleicht auch eine Lösung?

    Edit: Habe gerade das Komma durch den Punkt ersetzt, dann stimmt es wieder.
    Probiere noch aus, wie ich das ganze ersetzen kann,
    bevor es in die Listview kommt.

    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (23. Juni 2011 um 11:46)

    • Offizieller Beitrag

    Du kannst es auch vor dem sortieren ersetzen lassen und hinterher wieder zurücksetzen:

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $programm = 'Test'

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLi

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($programm, 500, 500)
    $GuiBut_beenden = GUICtrlCreateButton('Beenden', 5, 5)
    ;$GuiList = GUICtrlCreateListView('Datei|Zuletzt Bearbeitet|Größe', 80, 20, 400, 200, 0x0001, BitOR(0x00000001, 0x00000020, 0x00010000))
    $ListView1 = GUICtrlCreateListView("Nr|Spalte1|Spalte2|Spalte3", 24, 72, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($ListView1, 0, 40)
    _GUICtrlListView_SetColumnWidth($ListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 2, 75)
    _GUICtrlListView_SetColumnWidth($ListView1, 3, 75)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlCreateListViewItem('A|qwer|zuio', $ListView1)
    ;GUICtrlCreateListViewItem('B|asdf|hjkl', $ListView1)
    ;GUICtrlCreateListViewItem('C|yxcv|vbnm', $ListView1)
    ;_GUICtrlListView_SimpleSort($ListView1, $B_DESCENDING, 3)
    #endregion ### END Koda GUI section ###
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 30
    $aLi = $i & ",20" & '|' & '|' & '|'
    GUICtrlCreateListViewItem($aLi, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Global $hWndListView = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_RegisterSortCallBack($hWndListView)
    Do
    $aktion = GUIGetMsg()
    Switch $aktion
    Case $ListView1
    _SwitchKomma($ListView1, ',', '.')
    _GUICtrlListView_SortItems($hWndListView, GUICtrlGetState($ListView1))
    _SwitchKomma($ListView1, '.', ',')
    Case $GuiBut_beenden
    ContinueCase
    Case -3
    _GUICtrlListView_UnRegisterSortCallBack($hWndListView)
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func _SwitchKomma($hListView, $sSearch, $sReplace)
    _GUICtrlListView_BeginUpdate($hListView)
    For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
    _GUICtrlListView_SetItemText($hListView, $i, StringReplace(_GUICtrlListView_GetItemText($hListView, $i), $sSearch, $sReplace))
    Next
    _GUICtrlListView_EndUpdate($hListView)
    EndFunc ;==>_SwitchKomma

    [/autoit]
  • Hallo Oscar,

    super, bin gerade dabei meine Listview neu aufzubauen.
    Eine Frage noch:

    Ich möchte gerne in meiner Listview eine "Filter-Volltextsuche" einbauen.
    Wenn also alle Spalten gefüllt sind,
    damit ich optimal in der ganzen Liste suchen kann.
    Suche ich z.B. Hunde, daß dann die Listview nur diese Einträge
    zeigt.

    Gibt es da vielleicht eine UDF die sowas kann?


    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    Das wurde schonmal gefragt, deshalb hatte ich mein Listview-Datenbank-Beispiel dahingehend erweitert:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $sHeader = "Artikelnummer|Art|Nummer|Baureihe|Name" ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $sDBFile = @ScriptDir & "\datenbank.txt" ; Pfad und Name der Datenbank-Datei
    Global $iEdit = -1 ; Wert auf -1 setzen, weil _GUICtrlListView_GetSelectionMark() einen Nullbasierten Wert liefert

    [/autoit] [autoit][/autoit] [autoit]

    #region Hauptfenster
    Global $hGui = GUICreate("Listview-Datenbank-Beispiel", 600, 480) ; Hauptfenster erstellen
    GUISetBkColor(0xCCCCCC)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView = GUICtrlCreateListView($sHeader, 0, 0, 600, 400, $LVS_SHOWSELALWAYS) ; Listview erstellen

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLVHandle = GUICtrlGetHandle($hListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Artikelnummer", 120, 1) ; 1. Spalte = 120 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Art", 60, 0) ; 2. Spalte = 60 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Nummer", 90, 0) ; 3. Spalte = 90 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Baureihe", 100, 0) ; 4. Spalte = 100 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Name", 120, 0) ; 5. Spalte = 120 Px breit, links ausgerichtet

    [/autoit] [autoit][/autoit] [autoit]

    Global $hSearchListView = GUICtrlCreateListView($sHeader, 0, 0, 600, 400, $LVS_SHOWSELALWAYS) ; Listview für die Suche erstellen
    GUICtrlSetState(-1, $GUI_HIDE)
    Global $hSearchLVHandle = GUICtrlGetHandle($hSearchListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hSearchLVHandle, 0, "Artikelnummer", 120, 1) ; 1. Spalte = 120 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hSearchLVHandle, 1, "Art", 60, 0) ; 2. Spalte = 60 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hSearchLVHandle, 2, "Nummer", 90, 0) ; 3. Spalte = 90 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hSearchLVHandle, 3, "Baureihe", 100, 0) ; 4. Spalte = 100 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hSearchLVHandle, 4, "Name", 120, 0) ; 5. Spalte = 120 Px breit, links ausgerichtet

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("Suchbegriff:", 10, 412, 90, 20)
    GUICtrlSetFont(-1, 11)
    Global $hSearch = GUICtrlCreateInput("", 100, 410, 390, 20) ; Suchbegriff-Input erstellen
    GUICtrlSetFont(-1, 11)
    Global $hSearchStart = GUICtrlCreateButton("Suche...", 500, 410, 60, 20, $BS_DEFPUSHBUTTON) ; Dieser Button ist der Default-Push-Button (wenn der User [Enter] drückt)
    GUICtrlSetFont(-1, 9)
    Global $hSearchReset = GUICtrlCreateButton("<-", 562, 410, 28, 20) ; Reset-Button erstellen
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    GUICtrlSetState(-1, $GUI_DISABLE) ; den Reset-Button deaktivieren

    [/autoit] [autoit][/autoit] [autoit]

    Global $hNew = GUICtrlCreateButton("Neuer Eintrag", 5, 440, 80, 35)
    Global $hEdit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 95, 440, 110, 35, $BS_MULTILINE) ; $BS_Multiline für mehrzeiligen Button
    Global $hLoad = GUICtrlCreateButton("Laden", 230, 440, 70, 35)
    Global $hSave = GUICtrlCreateButton("Speichern", 310, 440, 70, 35)
    Global $hDel = GUICtrlCreateButton("Markierte Einträge löschen", 400, 440, 90, 35, $BS_MULTILINE)
    Global $hDelAll = GUICtrlCreateButton("Alle Einträge löschen", 500, 440, 90, 35, $BS_MULTILINE)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hCM = GUICtrlCreateContextMenu($hListView) ; ein Kontextmenü für das Listview erstellen
    Global $hCMNew = GUICtrlCreateMenuItem("Neuer Eintrag", $hCM) ; der 1. Kontextmenüeintrag
    Global $hCMEdit = GUICtrlCreateMenuItem("Eintrag bearbeiten", $hCM) ; der 2. Kontextmenüeintrag
    Global $hCMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $hCM) ; der 3. Kontextmenüeintrag
    #endregion Hauptfenster

    [/autoit] [autoit][/autoit] [autoit]

    #region Fenster für neuen Eintrag
    Global $hGuiNew = GUICreate("Neuer Eintrag", 632, 140, -1, -1, $WS_SYSMENU) ; das Fenster "Neuer Eintrag" erstellen
    Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
    Global $aNew[$aHeader[0]] ; Array für die Input-IDs
    For $i = 1 To $aHeader[0]
    GUICtrlCreateLabel($aHeader[$i], 4 + ($i - 1) * 125, 15, 110, 20) ; Überschriften-Label erstellen
    GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
    $aNew[$i - 1] = GUICtrlCreateInput("", 2 + ($i - 1) * 125, 30, 120, 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
    GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
    Next
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 65, 120, 25, $BS_DEFPUSHBUTTON) ; Button zum speichern
    #endregion Fenster für neuen Eintrag

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hLVHandle) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann
    _GUICtrlListView_RegisterSortCallBack($hSearchLVHandle) ; damit man das Suche-Listview (mit Klick auf die Spaltenüberschrift) sortieren kann

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGui) ; Hauptfenster sichtbar machen

    [/autoit] [autoit][/autoit] [autoit]

    If FileExists($sDBFile) Then Load() ; wenn Datenbank-Datei existiert, dann Datenbank laden

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg(1) ; Message-Event holen (1) = erweiterter Modus
    Switch $nMsg[0] ; anhand der Control-ID das entsprechende Case aufrufen
    Case $hSearchListView ; User hat auf eine Spaltenüberschrift geklickt
    _GUICtrlListView_SortItems($hSearchLVHandle, GUICtrlGetState($hSearchListView)) ; Einträge entsprechend sortieren
    Case $hListView ; User hat auf eine Spaltenüberschrift geklickt
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView)) ; Einträge entsprechend sortieren
    Case $hSearchStart ; Benutzer hat auf "Suche..." geklickt
    GUICtrlSetState($hSearchStart, $GUI_DISABLE) ; Button deaktivieren
    _GUICtrlListView_DeleteAllItems($hSearchLVHandle) ; alle Einträge aus dem Suche-Listview entfernen
    Dim $sSearch = GUICtrlRead($hSearch), $sItem
    For $i = 0 To _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; In einer Schleife alle Listview-Einträge durchsuchen
    $sItem = _GUICtrlListView_GetItemTextString($hLVHandle, $i) ; die entsprechende Zeile auslesen
    If StringInStr($sItem, $sSearch) Then GUICtrlCreateListViewItem($sItem, $hSearchListView) ; und falls das Suchwort darin vorkommt, einen neuen Eintrag im Suche-Listview erstellen
    Next
    If _GUICtrlListView_GetItemCount($hSearchLVHandle) = 0 Then ; wenn kein Suchtreffer, dann...
    GUICtrlSetBkColor($hSearchListView, 0xFF8888) ; Hintergrundfarbe in Rot ändern
    Else
    GUICtrlSetBkColor($hSearchListView, 0x88FF88) ; ansonsten Hintergrundfarbe in grün ändern
    EndIf
    GUICtrlSetState($hListView, $GUI_HIDE) ; das normale Listview verstecken
    GUICtrlSetState($hSearchListView, $GUI_SHOW) ; und das Suche-Listview anzeigen
    GUICtrlSetState($hSearchReset, $GUI_ENABLE) ; den Reset-Button aktivieren, damit der Benutzer wieder auf das normale Listview umschalten kann
    Case $hSearchReset ; Benutzer hat auf den Reset-Button geklickt
    GUICtrlSetData($hSearch, "") ; das Suchbegriff-Input leeren
    GUICtrlSetState($hSearchListView, $GUI_HIDE) ; das Suche-Listview verstecken
    GUICtrlSetState($hListView, $GUI_SHOW) ; das normale Listview wieder anzeigen
    GUICtrlSetState($hSearchStart, $GUI_ENABLE) ; den "Suche..."-Button wieder aktivieren
    GUICtrlSetState($hSearchReset, $GUI_DISABLE) ; und den Reset-Button deaktivieren
    Case $hNew, $hCMNew ; Benutzer hat auf "Neuer Eintrag" geklickt
    WinSetTitle($hGuiNew, "", "Neuer Eintrag") ; den Titel des Fenster anpassen
    GUISetState(@SW_SHOW, $hGuiNew) ; das Fenster "Neuer Eintrag" anzeigen
    GUISetState(@SW_DISABLE, $hGui) ; das Hauptfenster deaktivieren
    Case $hEdit, $hCMEdit ; User hat auf "Eintrag bearbeiten" geklickt
    WinSetTitle($hGuiNew, "", "Eintrag bearbeiten") ; den Titel des Fenster anpassen
    GUISetState(@SW_SHOW, $hGuiNew) ; das Fenster "Neuer Eintrag" anzeigen
    GUISetState(@SW_DISABLE, $hGui) ; das Hauptfenster deaktivieren
    Edit()
    Case $hLoad ; Benutzer hat auf "Laden" geklickt
    Load()
    Case $hSave ; Benutzer hat auf "Speichern" geklickt
    Save()
    Case $hDel, $hCMDel ; Benutzer hat auf "Markierte Einträge löschen" geklickt
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie die markierten Einträge wirklich löschen?") = 6 Then _GUICtrlListView_DeleteItemsSelected($hLVHandle)
    Case $hDelAll ; User hat auf "Alle Einträge löschen" geklickt
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie wirklich alle Einträge löschen?") = 6 Then _GUICtrlListView_DeleteAllItems($hLVHandle)
    Case $hCreate ; Benutzer hat auf "Eintrag speichern" im Fenster "Neuer Eintrag" geklickt
    NewItem()
    Case $GUI_EVENT_CLOSE ; Benutzer hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
    Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
    Case $hGui ; Benutzer will das Hauptfenster schließen
    If MsgBox(32 + 4, "Beenden", "Wollen sie das Programm wirklich beenden?") = 6 Then End() ; wenn ja, dann End-Funktion aufrufen
    Case $hGuiNew ; Benutzer will das "Neuer Eintrag"-Fenster schließen
    $iEdit = -1
    For $i = 0 To UBound($aNew) - 1
    GUICtrlSetData($aNew[$i], "") ; Alle Eingabefelder leeren
    Next
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen
    EndSwitch
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func End()
    ;~ Save() ; wenn der vordere Kommentar entfernt wird, dann werden vor dem beenden noch die Daten gespeichert
    _GUICtrlListView_UnRegisterSortCallBack($hSearchLVHandle) ; Sortierroutine wieder de-registrieren
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle) ; Sortierroutine wieder de-registrieren
    Exit ; Programm beenden
    EndFunc ;==>End

    [/autoit] [autoit][/autoit] [autoit]

    Func NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    Local $sItem = ""
    For $i = 0 To UBound($aNew) - 1 ; Schleife, um alle Eingabefelder durchzugehen
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    _GUICtrlListView_SetItemText($hLVHandle, $iEdit, GUICtrlRead($aNew[$i]), $i) ; den Eintrag aus dem Eingabefeld ins Listview schreiben
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    $sItem &= GUICtrlRead($aNew[$i]) & "|" ; den Eintrag aus dem Eingabefeld erstmal in einer Variablen ($sItem) speichern
    EndIf
    GUICtrlSetData($aNew[$i], "") ; das entsprechende Eingabefeld leeren
    Next
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    $iEdit = -1
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    Sleep(300)
    WinActivate($hGui) ; und in den Vordergrund holen
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    GUICtrlSetState($aNew[0], $GUI_FOCUS) ; den Focus wieder auf das erste Eingabefeld setzen, für weitere Eingaben
    GUICtrlCreateListViewItem(StringTrimRight($sItem, 1), $hListView) ; mit den Werten aus $sItem einen neuen Listview-Eintrag hinzufügen
    EndIf
    EndFunc ;==>NewItem

    [/autoit] [autoit][/autoit] [autoit]

    Func Edit() ; Funktion zum bearbeiten eines Listview-Eintrags im "Eintrag bearbeiten"-Fenster
    $iEdit = _GUICtrlListView_GetSelectionMark($hLVHandle) ; auslesen, welcher Listview-Eintrag markiert (bei mehreren, den obersten) ist
    If $iEdit > -1 Then
    Local $aItem = _GUICtrlListView_GetItemTextArray($hLVHandle, $iEdit) ; die Einträge aus dem Listview in ein Array holen
    For $i = 1 To $aItem[0]
    GUICtrlSetData($aNew[$i - 1], $aItem[$i]) ; und in die entsprechenden Eingabefelder schreiben
    Next
    EndIf
    EndFunc ;==>Edit

    [/autoit] [autoit][/autoit] [autoit]

    Func Load() ; Datenbank-Datei laden
    Local $hFile, $sContent, $aNewItems
    $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    $sContent = FileRead($hFile) ; Datei komplett einlesen
    FileClose($hFile) ; Datei schließen
    $sContent = StringTrimRight($sContent, 2) ; das letzte @CRLF entfernen
    $aNewItems = StringSplit($sContent, @CRLF, 1) ; Den Dateiinhalt am Zeilenende splitten
    If Not IsArray($aNewItems) Then Return ; Wenn $aNewItems kein Array ist, dann Funktion verlassen
    _GUICtrlListView_BeginUpdate($hLVHandle) ; Listview sperren
    For $i = 1 To $aNewItems[0] ; Alle Einträge des Arrays durchgehen
    GUICtrlCreateListViewItem($aNewItems[$i], $hListView) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
    Next
    _GUICtrlListView_EndUpdate($hLVHandle) ; Listview wieder freigeben
    EndIf
    EndFunc ;==>Load

    [/autoit] [autoit][/autoit] [autoit]

    Func Save() ; Datenbank-Datei speichern
    Local $sItem, $hFile, $iCount
    $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; Anzahl der Listview-Einträge holen
    If $iCount = -1 Then Return FileDelete($sDBFile) ; Wenn das Listview keine Einträge enthält, dann Datei löschen und Funktion verlassen
    $hFile = FileOpen($sDBFile, 2) ; Datei zum speichern (überschreiben) öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    For $i = 0 To $iCount ; Schleife, um alle Listview-Einträge durchzugehen
    $sItem = _GUICtrlListView_GetItemTextString($hLVHandle, $i) ; die Werte aus dem Listview-Eintrag holen
    FileWriteLine($hFile, $sItem) ; und in die Datei schreiben
    Next
    FileClose($hFile) ; Datei schließen
    EndIf
    EndFunc ;==>Save

    [/autoit]


    Dort kannst Du einen Suchbegriff eingeben und das Ergebnis wird im zweiten (vorher versteckten) Listview angezeigt.

    Edit: Skript mit weiteren Kommentaren versehen und eine Änderung der Hintergrundfarbe (grün = Suchtreffer vorhanden, rot = kein Suchtreffer) eingebaut.

    Edit2: Sortierung für das Suche-Listview hinzugefügt.

  • Hallo Oscar,

    hätte noch eine Frage zu deiner Listview:
    Diese Listview kann man ja auch sortieren.

    Wenn aber ein Filter gesetzt ist, dann klappt für diesen Filter die Sortierung leider nicht mehr!
    Das geht immer nur mit allen Datensätzen.
    Wenn der Filter aber viele Daten hat wäre es toll
    anschließend diese Suche zu sortieren.
    Schade, das geht nicht. Wenn das klappen würde das wäre super!

    Trotzdem, tolles Programm

    Liebe Grüße
    Ilse ;)

  • Hallo Oscar,

    muß mich wieder melden.
    Weißt du vielleicht wie man einen Hyperlink in eine Listview machen kann.
    Ich google schon ne zeitlang ohne Ergebnis.
    Hab auch einen Thread geöffnet...

    Geht das überhaupt?

    Grüße
    Ilse ;)