_GUICtrlListView_MoveItem -- markierten Eintrag im Listview auf/ab verschieben

    • Offizieller Beitrag

    Nicht dass ihr denkt, ich schreibe nur noch LUA-Skripte. :D

    Ich habs gerade gebraucht und deshalb dazu zwei Varianten erstellt (tauscht den Inhalt des markierten mit dem darüber/darunter liegendem Item aus).
    - _GUICtrlListView_MoveItem 
    Vorteil: schnell
    Nachteil: die Zuordnung zum Ctrl-ID geht verloren
    deshalb noch Variante 2
    - _GUICtrlListView_MoveItemCtrl
    Vorteil: Es wird ein Array mit den richtig zugeordneten Ctrl-ID zurückgegeben (braucht man z.B. für GuiCtrlSetBkColor )
    Nachteil: Das Listview wird komplett neu befüllt, daher langsamer.

    MoveLV_Item.au3
    [autoit]

    #Region - TimeStamp
    ; 2012-03-13 19:12:46
    #EndRegion - TimeStamp

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

    #include-once
    #Include <GuiListView.au3>
    #Include <WinAPI.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Example()

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

    Func Example()
    GUICreate("Move selected Item", 260, 250, 100, 200)
    $listview = GUICtrlCreateListView("col0|col1 |col2 |col3 ", 10, 10, 200, 150)
    $hLV = GuiCtrlGetHandle($listview)
    $down = GUICtrlCreateButton('/\', 215, 10, 15, 15)
    $up = GUICtrlCreateButton('\/', 215, 26, 15, 15)
    $item1 = GUICtrlCreateListViewItem("2|item_2|col_22|col_23", $listview)
    $item2 = GUICtrlCreateListViewItem("1|item_1|col_12|col_13", $listview)
    $item3 = GUICtrlCreateListViewItem("3|item_3|col_32|col_33", $listview)
    GUISetState()
    while 1
    Switch GUIGetMsg()
    Case $up
    ;~ _GUICtrlListView_MoveItem($hLV, 1)
    _GUICtrlListView_MoveItemCtrl($hLV, 1)
    case $down
    ;~ _GUICtrlListView_MoveItem($hLV, -1)
    _GUICtrlListView_MoveItemCtrl($hLV, -1)
    case -3
    exit
    EndSwitch
    wend
    EndFunc ;==>Example

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

    ;===============================================================================
    ; Function Name....: _GUICtrlListView_MoveItem
    ; Description......: Verschiebt den Inhalt eines markierten Item um jeweils eine Position auf-/abwärts
    ; Parameter(s).....: $_hWnd Listview-ID oder /-Handle
    ; .................: $_i RichtungsIndex (1 aufwärts/ -1 abwärts)
    ; Requirement(s)...: GuiListView.au3
    ; Return Value(s)..: keine
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlListView_MoveItem($_hWnd, $_i)
    If Not IsHWnd($_hWnd) Then $_hWnd = GuiCtrlGetHandle($_hWnd)
    Local $index = _GUICtrlListView_GetSelectedIndices($_hWnd)
    If $index = '' Or $index < 0 Then Return
    If $index = 0 And $_i = -1 Then Return
    Local $count = _GUICtrlListView_GetItemCount($_hWnd)
    If $index = $count -1 And $_i = 1 Then Return
    Local $aSelected = _GUICtrlListView_GetItemTextArray($_hWnd, $index)
    Local $indxTmp = $index + ($_i), $aTmp = _GUICtrlListView_GetItemTextArray($_hWnd, $indxTmp)
    For $i = 1 To $aSelected[0]
    _GUICtrlListView_SetItemText($_hWnd, $indxTmp, $aSelected[$i], $i-1)
    _GUICtrlListView_SetItemText($_hWnd, $index, $aTmp[$i], $i-1)
    Next
    _GUICtrlListView_SetItemSelected($_hWnd, $indxTmp, True, True)
    EndFunc ;==>_GUICtrlListView_MoveItem

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

    ;===============================================================================
    ; Function Name....: _GUICtrlListView_MoveItemCtrl
    ; Description......: Verschiebt den Inhalt eines Item um jeweils eine Position auf-/abwärts
    ; .................: Dazu werden die ListviewItem in neuer Reihenfolge neu erstellt.
    ; Parameter(s).....: $_hWnd Listview-ID oder /-Handle
    ; .................: $_i RichtungsIndex (1 aufwärts/ -1 abwärts)
    ; Requirement(s)...: GuiListView.au3, WinAPI.au3
    ; Return Value(s)..: Array mit neu erstellten ItemCtrl-ID
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlListView_MoveItemCtrl($_hWnd, $_i)
    If Not IsHWnd($_hWnd) Then $_hWnd = GuiCtrlGetHandle($_hWnd)
    Local $index = _GUICtrlListView_GetSelectedIndices($_hWnd)
    If $index = '' Or $index < 0 Then Return
    If $index = 0 And $_i = -1 Then Return
    Local $count = _GUICtrlListView_GetItemCount($_hWnd)
    If $index = $count -1 And $_i = 1 Then Return
    Local $indxTmp = $index + ($_i), $aItem[$count], $aOut[$count]
    For $i = 0 To $count -1
    $aItem[$i] = _GUICtrlListView_GetItemTextString($_hWnd, $i)
    Next
    _GUICtrlListView_BeginUpdate($_hWnd)
    _GUICtrlListView_DeleteAllItems($_hWnd)
    Local $sTmp, $ID_LV = _WinAPI_GetDlgCtrlID($_hWnd)
    For $i = 0 To $count -1
    Switch $i
    Case $index
    $sTmp = $aItem[$indxTmp]
    Case $indxTmp
    $sTmp = $aItem[$index]
    Case Else
    $sTmp = $aItem[$i]
    EndSwitch
    $aOut[$i] = GuiCtrlCreateListViewItem($sTmp, $ID_LV)
    Next
    _GUICtrlListView_SetItemSelected($_hWnd, $indxTmp, True, True)
    _GUICtrlListView_EndUpdate($_hWnd)
    Return $aOut
    EndFunc ;==>_GUICtrlListView_MoveItemCtrl

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

    Edit [2018-04-10]: In dieser Variante können auch mehrere markierte Zeilen gleichzeitig verschoben werden.

  • Hallo kra88

    Ist vllt. mit Kanonen auf Spatzen geschossen. Aber kennst du die UDF GUIListViewEx von Melba23 aus dem engl. Forum? Als Alternative möchte ich sie nennen.

    Grüße autoiter

  • kra88 was mir dazu spontan einfallen würde - evtl. wäre es möglich wenn du multiselect aktiviert hast dass du schaust welche Einträge ausgelesen sind und du schiebst sie nacheinander um einen oder mehrere Plätze nach unten. Kann aber sein dass das gar nicht funktioniert mit dieser UDF oder schlicht und ergreifend Stuss ist. Aber das wäre mir jetzt spontan dazu eingefallen. Aber ansonsten BugFix - super Idee!! :thumbup:

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

    • Offizieller Beitrag

    Habe die Funktion jetzt umgeschrieben. Nun ist auch ein Verschieben bei Mehrfachauswahl möglich. Die markierten Zeilen müssen nicht zusammenhängend sein.