ListviewItem nach best. Spalte sortieren

  • ich hab noch eine frage:

    Gibts irgendwie ne möglichkeit die einträge nach einer bestimmten spalte zu sortieren ohne das über ein array zu machen? bsp:

    spalte1 | spalte2

    textx | 15
    texty | 8
    textz | 36

    soll so sortiert werden:

    spalte1 | spalte2

    texty | 8
    textx | 15
    textz | 36

  • _GUICtrlListView_RegisterSortCallBack
    --------------------------------------------------------------------------------
    Register the Simple Sort callback function

    [autoit]

    #Include <GuiListView.au3>
    _GUICtrlListView_RegisterSortCallBack($hWnd[, $fNumbers = True[, $fArrows = True]])

    [/autoit]

    Parameters:
    $hWnd Handle of the control
    $fNumbers Treat number strings as numbers
    $fArrows Draws a down-arrow/up-arrow on column selected (Windows XP and above)

    Remarks:
    For each call to _GUICtrlListView_RegisterSortCallBack there must be a call
    to _GUICtrlListView_UnRegisterSortCallBack when done (before exit)
    It is up to the user to call _GUICtrlListView_UnRegisterSortCallBack for each
    _GUICtrlListView_RegisterSortCallBack call made.

  • wo ist die hilfe zu diesem Befehl? ich würde gerne das beispiel dazu sehen. In meiner Hilfe ist dieser Befehl garnicht aufgeführt..
    Denn wenn ich es auf ein Listview anwende wird nichts sortiert.

    Danke

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • doch benutze das handle des Listviews.

    Oh ok dann muss ich mir die englische Hilfe nochmal besorgen. Danke

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    • Offizieller Beitrag

    Hi,
    ich hab das Hilfebeispiel mal etwas schlanker gemacht.
    Sortieren per Klick auf Spaltenkopf. Du kannst den Sortierbefehl natürlich auch per Button auslösen.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $hListView, $B_DESCENDING
    GUICreate("ListView SimpleSort", 400, 300)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line4|5|more_a", $hListView)
    GUICtrlCreateListViewItem("line5|4.50 |more_c", $hListView)
    GUICtrlCreateListViewItem("line5|4.0 |more_c", $hListView)
    GUICtrlCreateListViewItem("line3|23|more_e", $hListView)
    GUICtrlCreateListViewItem("line2|0.34560 |more_d", $hListView)
    GUICtrlCreateListViewItem("line1|1.0 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|0.1 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|10|more_b", $hListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 2, 75)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)]

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If ($hWndFrom = $hWndListView) And ($iCode = $LVN_COLUMNCLICK) Then
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    EndIf
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • bei Dir schaut das immer so leicht aus. Habe es versucht in meine Anwendung zu übertragen aber bisher gescheitert ;(

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    • Offizieller Beitrag

    Wichtig sind 2 Zeilen
    - registrieren der Ereignisfunktion um den Spaltenklick auszuwerten
    - Deklaration der Variable für die Sortierrichtung

    Wenn du per Button sortieren möchtest, sieht dasselbe Bsp. so aus:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $hListView, $B_DESCENDING, $sortCol0, $sortCol1, $sortCol2, $msg
    GUICreate("ListView SimpleSort", 400, 340)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line4|5|more_a", $hListView)
    GUICtrlCreateListViewItem("line5|4.50 |more_c", $hListView)
    GUICtrlCreateListViewItem("line5|4.0 |more_c", $hListView)
    GUICtrlCreateListViewItem("line3|23|more_e", $hListView)
    GUICtrlCreateListViewItem("line2|0.34560 |more_d", $hListView)
    GUICtrlCreateListViewItem("line1|1.0 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|0.1 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|10|more_b", $hListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 2, 75)
    $sortCol0 = GUICtrlCreateButton('Spalte 1', 10, 300, 80, 20)
    $sortCol1 = GUICtrlCreateButton('Spalte 2', 110, 300, 80, 20)
    $sortCol2 = GUICtrlCreateButton('Spalte 3', 210, 300, 80, 20)
    GUISetState()

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

    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)] ; Variable ist erforderlich für die Sortierrichtung

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

    Do
    $msg = GUIGetMsg()
    Switch $msg
    Case $sortCol0
    _GUICtrlListView_SimpleSort($hListView, $B_DESCENDING, 0)
    Case $sortCol1
    _GUICtrlListView_SimpleSort($hListView, $B_DESCENDING, 1)
    Case $sortCol2
    _GUICtrlListView_SimpleSort($hListView, $B_DESCENDING, 2)
    EndSwitch
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit]
  • Danke habs hinbekommen jetzt

  • BugFix
    cool jetzt funktionierts :):thumbup:
    Das letztere Beispiel war einfach genug für mich ! :D

    vielen Dank!

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Kann es sein, das GUIRegisterMsg mit Autoit 3.2.2.0 noch nicht richtig funktioniert?
    Ich bekomm da jedes Mal massig Fehlermeldungen bezüglich nicht deklarierter Variablen...

    • Offizieller Beitrag

    Kann es sein, das GUIRegisterMsg mit Autoit 3.2.2.0 noch nicht richtig funktioniert?
    Ich bekomm da jedes Mal massig Fehlermeldungen bezüglich nicht deklarierter Variablen...

    Die Funktion an sich funktionierte auch dort. Aber evtl. einige der UDF nicht. Es ist ratsam, immer die aktuelle Stable zu nutzen. Erleichtert auch den Support, dann ist man imner auf gleichem Level und braucht nicht den Fehler in Versionsdetails zu suchen.

  • *buddel*

    ewig gebraucht... wegen eigener Unfähigkeit geweint...

    [autoit]

    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)] ; Variable ist erforderlich für die Sortierrichtung

    [/autoit][autoit]

    Local $B_DESCENDING[_GUICtrlListView_GetColumnCount($current)]
    _GUICtrlListView_SimpleSort($current, $B_DESCENDING, 8)

    [/autoit]


    ich hab gerade nicht einmal eine Idee wie ich die Sortierreihenfolge umdrehen kann... So sortiert es 0 1 2 3 also aufsteigend ich würde nur gerne 3 2 1 0 sortieren also absteigend.

    gruß

  • Ich frage mich wieso So Kompliziert?

    Du Meintest sicher Sowas oder?
    [autoit]


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

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

    $hGui = GuiCreate('',240,140,-1,-1) ;Erstellt die Gui
    Global $Header = '1|2|3|4' ;Titel der ListView Tabs
    Global $ListView = GUICtrlCreateListView($Header,10,10,220,120) ;ListView erstellung
    GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 50) ;|
    GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 50) ;> Stellt die "Länge" der ListView Tabs ein
    GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, 50) ;| GUICtrlSendMsg($ListView = Das ListView welches du erstellst, $LVM_SETCOLUMNWIDTH = Sagt was du machen willst, 0 = Tab(In diesemfall 0-3, Tab ID's beginnen immer mit 0, 50 = Die breite (In Pixel))
    GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 3, 50) ;|
    GUICtrlCreateListViewItem('Item 1a|Item 1b|Item 1c|Item 1d',$ListView) ;|
    GUICtrlCreateListViewItem('Item 2a|Item 2b|Item 2c|Item 2d',$ListView) ;> Erstellt die ListView Items (ListView Einträge)
    GUICtrlCreateListViewItem('Item 3a|Item 3b|Item 3c|Item 3d',$ListView) ;|
    GUICtrlCreateListViewItem('Item 4a|Item 4b|Item 4c|Item 4d|',$ListView) ;|
    _GUICtrlListView_RegisterSortCallBack($ListView) ;Wie Sortiert wird (IN Diesemfall standard da kein wer bei $fArrows angegeben wurde // _GUICtrlListView_RegisterSortCallBack($hWnd[, $fNumbers = True[, $fArrows = True]]) //)

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

    GUISetState(@SW_SHOW,$hGui)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ListView ;Wen du auf einen 'Header' (1|2|3|4) der ListView Klickst, führe aus
    _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView)) ;Startet die Sortier-Callback Funktion und setzt den Pfeil in der Kopfzeile(Tab)
    EndSwitch
    WEnd
    ;~ _GUICtrlListView_UnRegisterSortCallBack($hGui) ;Eigentlich sollte das aktiv sein, aber geht auch ohne

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

    ;Wichtig ist dass Case $ListView ohne dass, wird nicht Sortiert

    [/autoit]


    hab ich schnell hingezaubert, hoffe es hilft weiter ^^

    Greez

    2 Mal editiert, zuletzt von Skilkor (23. Januar 2013 um 10:51)

    • Offizieller Beitrag

    ich hab gerade nicht einmal eine Idee wie ich die Sortierreihenfolge umdrehen kann


    Ganz simpel bei Benutzung von " _GUICtrlListView_SimpleSort " :
    • erster Aufruf sortiert aufwärts
    • zweiter Aufruf sortiert dann abwärts
    usw.
    oder du übergibst als Flag True/False - s. Hilfe

  • Skilkor erstmal danke für deine Mühen. :)
    um ehrlich zu sein, finde ich das ganze sortieren mehr kompliziert als nötig egal welchen ansatz man nimmt. ;)

    ich möchte ja nur abfallend auf eine spezielle spalte sortieren und zwar nachdem ich das listview erstellt habe. Nicht erst wenn ich Spaltenkopf angeklickt habe.
    einen ähnlichen Ansatz wie von dir hatte ich Schonmal in der Mangel. aber wenn ich die while schleife einfach wegnehme und es so schreibe

    [autoit]

    _GUICtrlListView_RegisterSortCallBack($ListView)
    GUISetState(@SW_SHOW,$hGui)_GUICtrlListView_SortItems($ListView, 8) ; 8 ist die letzte spalte

    [/autoit]

    passiert einfach mal garnichts.

    oh Danke Bug... :)

  • naja, du hast mein bsp nicht ganz verstanden, ich Kommentiere es evt am besten schnell aus für dich

    **Edit:
    Habe mein Vorpost Script Bearbeitet...
    Sry ich vergess immer die Auskommentierung :S

    Einmal editiert, zuletzt von Skilkor (23. Januar 2013 um 10:50)

  • ich möchte ja nur abfallend auf eine spezielle spalte sortieren und zwar nachdem ich das listview erstellt habe. Nicht erst wenn ich Spaltenkopf angeklickt habe.


    Dann schau dir das von BugFix bereitserwähnte

    [autoit]

    _GUICtrlListView_SimpleSort

    [/autoit]

    in sw Hilfe an.

    mfg autoBert