Listview von fornherein sortierbar per klick auf spalten überschriften ?

  • Listview von fornherein sortierbar per klick auf spalten überschriften ?
    ^^ geht das oder nicht ?
    ich habe in der hilfe folgendes gefunden... zitat:
    Funktion GUICtrlCreateListViewDas Sortieren der Listeneinträge durch Klick auf die Spaltenüberschriften (wie im Explorer) ist zur Zeit noch nicht implementiert.

    Bei den ganzen funktionen die listview anbietet kann ich mir gar nicht vorstellen das dem wirklich so ist!

    Einmal editiert, zuletzt von WhiteLion (21. Juni 2010 um 12:14)

    • Offizieller Beitrag

    Bei den ganzen funktionen die listview anbietet kann ich mir gar nicht vorstellen das dem wirklich so ist!


    Glaub es ruhig. Lösung bisher so:

    Spoiler anzeigen
    [autoit]

    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #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]
    • Offizieller Beitrag

    Weniger Aufwand?
    Ok, es geht auch so:

    Spoiler anzeigen
    [autoit]


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

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

    GUICreate('Listview-sortieren', 600, 400)
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 580, 380)

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

    For $i = 0 To 9 ; zufällige ListView-Einträge erstellen
    GUICtrlCreateListViewItem(Random(1000, 9999, 1) & '|' & Random(1000, 9999, 1) & '|' & Random(1000, 9999, 1), $hListView)
    Next

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

    _GUICtrlListView_RegisterSortCallBack($hListView) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    Exit
    Case $hListView ; User hat auf eine Spaltenüberschrift geklickt
    _GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView)) ; Einträge entsprechend sortieren
    EndSwitch
    WEnd

    [/autoit]

    Edit: Man benötigt das Handle gar nicht mehr. Das wurde wohl inzwischen geändert. :)