Eintrag in einem ListView verschieben

    • Offizieller Beitrag

    _MoveLVItem($ItemIndex, $StepWidth, $hLV)

    Der per $ItemIndex angegebene Eintrag eines ListView wird um die in $StepWidth angegebene Anzahl (und Richtung, '-' nach oben) verschoben.

    Edit:
    Hab jetzt mal noch eine ergänzende Funktion für das Verschieben markierter Elemente hinzugefügt (die obige Funktion verwendet).

    An der Funktion hab ich noch einen Bug gefixt - Verschieben mit positiver Zahl war fehlerhaft.

    _MoveAndMarkLVItem($hLV, $hGUI, $Skip)

    Hier in einem Bsp.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListView.au3>

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

    Opt("GUIOnEventMode", 1)
    Dim $arItem[8]
    $AForm1 = GUICreate("AForm1", 633, 454, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
    $ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 76, 76, 429, 221, BitOR _
    ($LVS_REPORT,$LVS_SHOWSELALWAYS), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES, _
    $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, 0x101E, 0, 80)
    GUICtrlSendMsg(-1, 0x101E, 1, 80)
    GUICtrlSendMsg(-1, 0x101E, 2, 80)
    For $i = 0 To 7
    $arItem[$i] = GUICtrlCreateListViewItem('Zeile ' & $i & '- 1' & '| - 2 | - 3', $ListView1)
    Next
    $Button1 = GUICtrlCreateButton("Move With Selection", 388, 340, 121, 29, 0)
    GUICtrlSetOnEvent(-1, "Button1Click")
    GUICtrlCreateLabel('Anzahl Zeilen und Richtung ("-" ist Auf) ', 140, 345, 200)
    $count = GUICtrlCreateInput('-1', 340, 343, 30)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func AForm1Close()
    Exit
    EndFunc

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

    Func Button1Click()
    _MoveAndMarkLVItem($ListView1, $AForm1, GUICtrlRead($count) )
    Switch @error
    Case 1
    MsgBox(0, 'Fehler', 'GUI oder ListView nicht vorhanden')
    Case 2
    MsgBox(0, 'Fehler', 'Schrittgröße oder Richtung falsch')
    EndSwitch
    EndFunc

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Funktion _MoveAndMarkLVItem($hLV, $hGUI, $Skip)
    ;
    ; Beschreibung verschiebt alle markierten Einträge eines ListViewCtrl um eine Anzahl Positionen
    ;
    ; Parameter $hLV: ListView ID
    ; $hGUI: GUI ID
    ; $Skip: Anzahl Zeilen um die die Einträge verschoben werden (negative Zahl - aufwärts)
    ;
    ; Return Erfolg: -1
    ; Fehler: 0 SetError 1 - GUI oder ListView nicht vorhanden
    ; 2 - Skip verweist auf Bereich außerhalb des ListViewIndex
    ;
    ; Erfordernisse #include <GuiListView.au3>
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _MoveAndMarkLVItem($hLV, $hGUI, $Skip)
    If (Not WinExists($hGUI)) Or (ControlGetHandle($hGUI, '', $hLV) = '') Then
    SetError(1)
    Return 0
    EndIf
    Local $arSelItems = _GUICtrlListViewGetSelectedIndices($hLV, 1)
    If $Skip < 0 Then
    For $i = 1 To $arSelItems[0]
    _MoveLVItem($arSelItems[$i], $Skip, $hLV)
    If @error Then
    SetError(2)
    Return 0
    EndIf
    Next
    Else
    For $i = $arSelItems[0] To 1 Step -1
    _MoveLVItem($arSelItems[$i], $Skip, $hLV)
    If @error Then
    SetError(2)
    Return 0
    EndIf
    Next
    EndIf
    GUISetState(@SW_LOCK, $hGUI)
    ControlClick($hGUI, '', $hLV)
    $idx = _GUICtrlListViewGetSelectedIndices($hLV, 0)
    Send("{UP " & $idx & "}") ; Auf Listenanfang
    For $i = 1 To $arSelItems[0]
    If $i = 1 Then
    If $arSelItems[$i]+$Skip > 0 Then
    Send("{DOWN " & $arSelItems[$i]+$Skip & "}")
    EndIf
    Else
    Send("^{DOWN " & $arSelItems[$i]-$arSelItems[$i-1] & "}")
    Send("^{SPACE}")
    EndIf
    Next
    GUISetState(@SW_UNLOCK, $hGUI)
    Return -1
    EndFunc ;==>_MoveAndMarkLVItem
    ;----------------------------------------------------------------------------------------------------------------------
    ; Funktion _MoveLVItem($ItemIndex, $StepWidth, $hLV)
    ;
    ; Beschreibung verschiebt per Index angegebenen Eintrag eines ListViewCtrl um eine Anzahl Positionen
    ;
    ; Parameter $ItemIndex: Index der Zeile
    ; $StepWidth: Anzahl Zeilen um die der Eintrag verschoben wird (negative Zahl - aufwärts)
    ; $hLV: ListView ID
    ;
    ; Erfordernisse #include <GuiListView.au3>
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    #include <GuiListView.au3>
    Func _MoveLVItem($ItemIndex, $StepWidth, $hLV)
    If ($ItemIndex + $StepWidth) < 0 Or _
    ($ItemIndex + $StepWidth) > _GUICtrlListViewGetItemCount($hLV)-1 Then
    SetError(1)
    Return 0
    EndIf
    Local $txt2skip = _GUICtrlListViewGetItemText($hLV, $ItemIndex)
    If $StepWidth < 0 Then
    _GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth, $txt2skip)
    _GUICtrlListViewDeleteItem($hLV, $ItemIndex+1)
    Else
    _GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth+1, $txt2skip)
    _GUICtrlListViewDeleteItem($hLV, $ItemIndex)
    EndIf
    Return -1
    EndFunc ;==>_MoveLVItem

    [/autoit]

    Ach, das ist ja mein Post Nr: :kette: 1 0 0 0

  • Hab mir mal Gedanken gemacht wie man mit der Funktion die Items auch einfach per Drag & Drop verschieben kann.

    Musste dafür aber die Funktion geringfügig ändern damit es korrekt funktioniert.
    Falls es mal jemand brauchen sollte:


    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $GUI = GUICreate("Test-GUI", 500, 300, -1, -1, -1, $WS_EX_ACCEPTFILES)
    GUISetOnEvent($GUI_EVENT_CLOSE, "raus")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_MoveListViewItem")
    $ListView = GUICtrlCreateListView("Eintrag", 10, 10, 480, 280)
    _GUICtrlListViewSetColumnWidth($ListView, 0, 475)

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

    For $i = 1 To 10
    $Item = GUICtrlCreateListViewItem("Eintrag " & $i, $ListView)
    Next

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func raus()
    Exit
    EndFunc ;==>raus

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

    ;Function by [email='AspirinJunkie@german-nlite.de'][/email] (benötigt globale Variable $ListView)
    Func _MoveListViewItem()
    Local $von, $bis, $down = GUIGetCursorInfo($GUI)

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

    If $down[4] = $ListView Then
    $von = _GUICtrlListViewGetHotItem($ListView)

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

    While $down[2]
    $down = GUIGetCursorInfo($GUI)
    Sleep(50)
    WEnd

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

    If $down[4] = $ListView Then
    $bis = _GUICtrlListViewGetHotItem($ListView)

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

    If Not ($von = $bis) Then
    _MoveLVItem($von, $bis - $von, $ListView)
    _GUICtrlListViewSetItemSelState($ListView, $bis, 1, 1)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_MoveListViewItem

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Funktion _MoveLVItem($ItemIndex, $StepWidth, $hLV)
    ;
    ; Beschreibung verschiebt per Index angegebenen Eintrag eines ListViewCtrl um eine Anzahl Positionen
    ;
    ; Parameter $ItemIndex: Index der Zeile
    ; $StepWidth: Anzahl Zeilen um die der Eintrag verschoben wird (negative Zahl - aufwärts)
    ; $hLV: ListView ID
    ;
    ; Erfordernisse #include <GuiListView.au3>
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    #include <GuiListView.au3>
    Func _MoveLVItem($ItemIndex, $StepWidth, $hLV)
    If ($ItemIndex + $StepWidth) < 0 Or _
    ($ItemIndex + $StepWidth) > _GUICtrlListViewGetItemCount($hLV) - 1 Then
    SetError(1)
    Return 0
    EndIf
    Local $txt2skip = _GUICtrlListViewGetItemText($hLV, $ItemIndex)

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

    If $StepWidth > 0 Then
    _GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth + 1, $txt2skip)
    _GUICtrlListViewDeleteItem($hLV, $ItemIndex)
    Else
    _GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth, $txt2skip)
    _GUICtrlListViewDeleteItem($hLV, $ItemIndex + 1)
    EndIf

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

    Return -1
    EndFunc ;==>_MoveLVItem

    [/autoit]