ListView Items löschen

  • Hallo Leute,
    ich habe mal wieder ein Problem.

    Ich hab eine GUI mit 2 ListViews erstellt. Wenn ich jetzt ein Item von ListView1 in ListView2 schiebe, funktioniert das auch, d.b. in ListView1 verschwindet das Element, in ListView2 taucht es auf. Jedoch beim zurückschieben von dem Element in ListView2 ein Fehler. Es taucht es zwar in ListView1 wieder auf, wird aber in ListView2 nicht gelöscht. Wie kann man es beheben?

    Spoiler anzeigen
    [autoit]


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

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 634, 604, -1,-1, 0, 0)
    $ListView1 = GUICtrlCreateListView("ListView1", 8, 8, 305, 529)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 301)
    GUICtrlSetState($ListView1, $GUI_DROPACCEPTED)
    GUICtrlCreateListViewItem("Item1", $ListView1)
    GUICtrlCreateListViewItem("Item2", $ListView1)
    GUICtrlCreateListViewItem("Item3", $ListView1)
    $ListView2 = GUICtrlCreateListView("ListView2", 320, 8, 305, 529)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 301)
    GUICtrlSetState($ListView2, $GUI_DROPACCEPTED)
    GUICtrlCreateListViewItem("Item4", $ListView2)
    GUICtrlCreateListViewItem("Item5", $ListView2)
    GUICtrlCreateListViewItem("Item6", $ListView2)
    $Button1 = GUICtrlCreateButton("OK", 144, 544, 171, 25, $WS_GROUP)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button2 = GUICtrlCreateButton("Abbrechen", 320, 544, 171, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_DROPPED
    For $t=0 To _GUICtrlListView_GetItemCount($Listview1)
    If _GUICtrlListView_GetItemFocused($Listview1,$t) Then
    _GUICtrlListView_InsertItem($Listview2,_GUICtrlListView_GetItemText($Listview1,$t),_GUICtrlListView_GetItemCount($Listview2))
    _GUICtrlListView_DeleteItem($listview1,$t)
    Endif
    Next

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

    For $t=0 To _GUICtrlListView_GetItemCount($Listview2)
    If _GUICtrlListView_GetItemFocused($Listview2,$t) Then
    _GUICtrlListView_InsertItem($Listview1,_GUICtrlListView_GetItemText($Listview2,$t),_GUICtrlListView_GetItemCount($Listview1))
    _GUICtrlListView_DeleteItem($listview2,$t)
    Endif
    Next

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

    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button2
    Exit
    EndSwitch
    Wend

    [/autoit]
    • Offizieller Beitrag

    1. Bitte rücke deinen Code ein, ist sonst schwer zu Lesen.
    2. Beim Arbeiten mit der Listview-UDF solltest du die Handle und nicht die ID verwenden
    3. Deine Methode war etwas aufwändig (immer das ganze Listview durchgehen um das Drag 'n Drop - Item zu finden). Das geht einfacher, wenn du $WM_NOTIFY benutzt, Bsp. habe ich erstellt

    Spoiler anzeigen
    [autoit]

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

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

    Global $ID, $Index

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 634, 604, -1,-1, 0, 0)
    $ListView1 = GUICtrlCreateListView("ListView1", 8, 8, 305, 529)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 301)
    GUICtrlSetState($ListView1, $GUI_DROPACCEPTED)
    GUICtrlCreateListViewItem("Item1", $ListView1)
    GUICtrlCreateListViewItem("Item2", $ListView1)
    GUICtrlCreateListViewItem("Item3", $ListView1)
    $hLV1 = GUICtrlGetHandle($Listview1)
    $ListView2 = GUICtrlCreateListView("ListView2", 320, 8, 305, 529)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 301)
    GUICtrlSetState($ListView2, $GUI_DROPACCEPTED)
    GUICtrlCreateListViewItem("Item4", $ListView2)
    GUICtrlCreateListViewItem("Item5", $ListView2)
    GUICtrlCreateListViewItem("Item6", $ListView2)
    $hLV2 = GUICtrlGetHandle($ListView2)
    $Button1 = GUICtrlCreateButton("OK", 144, 544, 171, 25, $WS_GROUP)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button2 = GUICtrlCreateButton("Abbrechen", 320, 544, 171, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    Switch $ID
    Case $Listview1
    _GUICtrlListView_InsertItem($hLV2, _GUICtrlListView_GetItemText($hLV1, $Index))
    _GUICtrlListView_DeleteItem($hLV1, $Index)
    Case $Listview2
    _GUICtrlListView_InsertItem($hLV1, _GUICtrlListView_GetItemText($hLV2, $Index))
    _GUICtrlListView_DeleteItem($hLV2, $Index)
    EndSwitch
    Case $GUI_EVENT_CLOSE, $Button2
    Exit
    EndSwitch
    Wend

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hLV1, $hLV2
    Switch $iCode
    Case $LVN_BEGINDRAG ; A drag-and-drop operation involving the left mouse button is being initiated
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    $ID = $iIDFrom
    $Index = DllStructGetData($tInfo, "Item")
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]