Listview - Sortierrichtung festlegen.

  • Hey,

    folgendes Problem:
    Eine Listviewspalte soll wie gewöhnlich durch einen Klick auf den Header sortiert werden.
    Allerdings nicht in beide Richtung sondern nur in eine:
    1,3,2 -> 1,2,3 -> 1,2,3 (und nicht zu 3,2,1)

    Abfragen des ersten und letzten Items und ggf. nochmal sortieren möchte ich aus Geschwindigkeitsgründen vermeiden.
    Bei einer anderen Abfrage müsste man auch alle Items durchgehen. ?(

    Hier das Beispiel zum Probieren:

    Spoiler anzeigen
    [autoit]


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

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 327, 505, 192, 124)
    $ListView1 = GUICtrlCreateListView("Test", 8, 16, 313, 401)
    $Button1 = GUICtrlCreateButton("Button1", 112, 448, 105, 33, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    global $hLVHandle = GUICtrlGetHandle($ListView1)
    for $i = 0 to 50
    GUICtrlCreateListViewItem(Random(1,100,1), $ListView1)
    next
    _GUICtrlListView_RegisterSortCallBack($hLVHandle)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle)
    Exit
    case $ListView1
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($ListView1))
    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von nuts (20. April 2010 um 10:43)

  • schonmal mit der hilfe versucht? da steht villt was

    Edit1:
    da ham wirs doch schon => _GUICtrlListView_SimpleSort($hWnd, ByRef $vDescending, $iCol)

    Zitat

    Funktion _GUICtrlListView_SimpleSort
    Parameter

    $hWnd Handle des Controls $vDescending kann sein:
    True - Sortiert absteigend (Descending)
    False - Sortiert aufsteigend (Ascending)
    $iCol Spaltennummer

    nimm das und gib als 2. parameter das ein, was du willst ;)

  • hier:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListview.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 327, 505, 192, 124)
    $ListView1 = GUICtrlCreateListView("Test", 8, 16, 313, 401)
    $Button1 = GUICtrlCreateButton("Button1", 112, 448, 105, 33, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    for $i = 0 to 50
    GUICtrlCreateListViewItem(Random(1,100,1), $ListView1)
    next
    _GUICtrlListView_RegisterSortCallBack(GUICtrlGetHandle($ListView1))

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack(GUICtrlGetHandle($ListView1))
    Exit
    case $ListView1
    _GUICtrlListView_SimpleSort(GUICtrlGetHandle($ListView1), True, 0); Sortieren von 1 zu 100 / False ist das gegenteil
    ; die letzte ziffer giebt den index der col an!
    EndSwitch
    WEnd

    [/autoit]

    ;)

  • Ist bei mir nicht lauffähig.

    Code
    D:\autoitskripte\kasse\Buchungssatzerfasser\sortbeispiel2.au3(27,78) : ERROR: _GUICtrlListView_SimpleSort() called with Const or expression on ByRef-param(s).
                _GUICtrlListView_SimpleSort(GUICtrlGetHandle($ListView1), True, 0)


    Definiert man das true/false vorher läuft es, allerdings ohne den erwünschten Effekt. ?(

    • Offizieller Beitrag

    Wenn du eine Sortierung in beide Richtungen haben willst, mach es so:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListview.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 327, 505, 192, 124)
    $ListView1 = GUICtrlCreateListView("Test", 8, 16, 313, 401)
    $Button1 = GUICtrlCreateButton("Button1", 112, 448, 105, 33, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($ListView1)]
    for $i = 0 to 50
    GUICtrlCreateListViewItem(Random(1,100,1), $ListView1)
    next
    _GUICtrlListView_RegisterSortCallBack(GUICtrlGetHandle($ListView1))

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack(GUICtrlGetHandle($ListView1))
    Exit
    case $ListView1
    _GUICtrlListView_SimpleSort(GUICtrlGetHandle($ListView1), $B_DESCENDING, 0); Sortieren von 1 zu 100 / False ist das gegenteil
    ; die letzte ziffer giebt den index der col an!
    EndSwitch
    WEnd

    [/autoit]

    Bei jedem klick auf den Header wird die Sortierreihenfolge geändert.

    • Offizieller Beitrag

    So geht es ohne Fehler ;)

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListview.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIListView.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 327, 505, 192, 124)
    $ListView1 = GUICtrlCreateListView("Test", 8, 16, 313, 401)
    $Button1 = GUICtrlCreateButton("Button1", 112, 448, 105, 33, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $B_DESCENDING= True
    for $i = 0 to 50
    GUICtrlCreateListViewItem(Random(1,100,1), $ListView1)
    next
    _GUICtrlListView_RegisterSortCallBack(GUICtrlGetHandle($ListView1))

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack(GUICtrlGetHandle($ListView1))
    Exit
    case $ListView1
    $B_DESCENDING = True
    _GUICtrlListView_SimpleSort(GUICtrlGetHandle($ListView1), $B_DESCENDING, 0); Sortieren von 1 zu 100 / False ist das gegenteil
    ; die letzte ziffer giebt den index der col an!
    EndSwitch
    WEnd

    [/autoit]


    Der Fehler kommt daher, das ein True nicht als Variable mit ByRef benutzt werden kann.
    $B_DESCENDING wird beim Ausführen von _GUICtrlListView_SimpleSort auf einen neuen Wert gesetzt.

  • Ja aber mit der Definition von Global $B_DESCENDING=false geht mit dem Fehler auch der Effekt (sortierung nur in eine Richtung) verloren.
    Trägt man "false" oder "true" in die Funktion ein und übergeht den Fehler (der bei einigen gar nicht kommt? :S ) funktionierts.

    Ah 8o Fehler erkannt, der Wert wird ja wieder verändert ;(

    edit \ Genau ohje - danke Raupi :thumbup:

    Einmal editiert, zuletzt von nuts (14. April 2010 um 19:44)

    • Offizieller Beitrag

    Die Sortierreihenfolge gibt du doch mit $B_DESCENDING = True vor, bevor die Sortierung durchgeführt wird . Im Endeffekt ist es so als wenn du gleich True reinschreibst. Nur es kommt nicht der Fehler.

    Die Variable $B_DESCENDING kanst du auch als Global $B_DESCENDING definieren. Der Wert ist egal, wird sowieso vor dem Aufruf neu gesetzt.

    Edit, hätte ich meinen Browser mal aktualisiert..... egal geschrieben ist geschrieben. :D