Drop auf ListView - auf welches ListViewItem wurde abgelegt?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    Drop auf ListView - auf welches ListViewItem wurde abgelegt?

    Guten Morgen allerseits!

    Ich arbeite gerade an einem Tool zur Verwaltung von Photos. Dabei werden Daten (Bilder, PDFs, ...) aus anderen Programmen (Explorer oder beliebiger anderer Dateimanager) auf mein Programm gezogen und dort abgelegt (DragDropEffects.Copy).
    Im speziellen werden die Bilder auf eine ListView-Komponente gezogen. Das ist ja auch grundsätzlich kein Problem und funktioniert auch,
    was ich aber wissen möchte, ist:

    auf welchem ListViewItem wurden die Daten abgelegt?

    Ich komme einfach nicht dahinter, wie ich herausfinden kann, auf welchem Item (View = LargeIcon) der Benutzer die Dateien abgelegt hat.
    Das ist für mich aber wichtig, weil je nachdem, auf welchem Item der Nutzer die Daten ablegt, diese vom Programm intern anders gehandhabt werden.

    Mein bisheriges Gerüst:

    VB.NET-Quellcode

    1. Private Sub categoryView_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles categoryView.DragOver
    2. ' DRAG OVER EVENT
    3. ' Set Effect to 'Copy'
    4. Dim DragTo = TryCast(e.Data, DataObject)
    5. If DragTo IsNot Nothing AndAlso DragTo.ContainsFileDropList Then
    6. e.Effect = DragDropEffects.Copy
    7. End If
    8. End Sub
    9. Private Sub categoryView_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles categoryView.DragDrop
    10. Dim DragTo = TryCast(e.Data, DataObject)
    11. Dim currentItem As ListViewItem
    12. ' Determine, which ListViewItem was the target:
    13. ' ???
    14. currentItem = _________________()?
    15. ' ???
    16. ' Add Data to the corresponding data structure:
    17. pList.Item(currentItem.Text).AddRange(DragTo.GetFildDropList.Cast(Of STring).ToList())
    18. End Sub


    Danke.
    Wird ein Item markiert, wenn du was drauf ablegst?

    Meinst du, ob das Item VORHER vom User ausgewählt wird, bevor er die Daten drauf ablegt, oder ob das Item durch den Drop markiert werden soll?

    Eigentlich wäre es für den Benutzer intuitiver, wenn er nicht erst ein Item auswählen muss und dann die Daten genau auf diesem abzulegen hat. Immerhin spart man sich dadurch Mausmeter. Vom Usability-Standpunkt aus gesehen also:
    Das Item soll dann markiert werden, wenn die Daten drauf abelegt werden und ich möchte herausfinden, welches es war.

    Stell bitte die Option Strict auf On.

    Erledigt.
    Ok, bin selber drauf gekommen, wie ich das Item herausfinden kann:

    VB.NET-Quellcode

    1. Dim p as Point = ListView1.PointToClient(New Point(e.X, e.Y))
    2. Dim currentItem as ListViewItem = ListView1.GetItemAt(p.X, p.Y)


    Was mit jetzt noch fehlt ist, dass das Item auch selektiert wird. Ich finde das optisch noch zu wenig überzeugend.