Drag'n Drop in einer ListView auf andere Items

  • VB.NET

Es gibt 66 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Drag'n Drop in einer ListView auf andere Items

    Hey.
    Ich habe eine ListView und möchte, dass man ein Item auf ein anderes Ziehen kann. Dann soll noch das gezogene Item sowie das Item auf das es gezogen wurde Identifiziert werden. Durch z.B. den Tag.
    Wie kann ich das am besten realisieren?

    Lg


    #edit: Das Programm MUSS Morgen früh fertig sein :s
    ...aber gut, dass wir darüber gesprochen haben!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sonderzeichen“ ()

    Hey,

    magst Du mal den Sinn dahinter erklären bitte? Dann fällt es evtl. leichter, eine passende Lösung anzubieten.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX

    Ich mach einen Dateibrowser. Da möchte ich, dass man Dateien in Ordner ziehen kann, nur weiß ich nicht, wie ich Abfrage, ob ein Item auf ein anderes gezogen wurde.
    Es würde mir ja schon reichen, wenn ich weiß, wie ich an die beiden Elemente komme (Das Item, was gezogen wurde, das andere, auf das es gezogen wurde)

    Hier ein Beispiel:


    Mein Problem fängt schon damit an, ich weiß nicht, wie ich aktivieren kann, dass ich Items mit der Maus ziehen kann.

    Lg
    ...aber gut, dass wir darüber gesprochen haben!
    Hier ein Beispiel, wie man es machen kann. Ich muss auch dazu sagen, ich bin, was Design und GUI-Funktionalitäten angeht, ein totaler Tiefflieger. Gibt bestimmt Lösungen, die sauberer sind, jedoch zeigt Dir mein Beispiel, wie Du es anpacken kannst. Verlass Dich nicht zu sehr darauf 8o An Verbesserungen wäre ich selber auch interessiert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _dragInit As Boolean = False
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. For i As Integer = 0 To 10
    5. Dim lVI As New ListViewItem(DateTime.Now.Millisecond.ToString())
    6. lVI.SubItems.Add(DateTime.Now.Millisecond.ToString())
    7. lVI.SubItems.Add(DateTime.Now.Millisecond.ToString())
    8. ListView1.Items.Add(lVI)
    9. Next
    10. End Sub
    11. Private Sub ListView1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView1.MouseDown
    12. If Not ListView1.SelectedItems.Count = 0 AndAlso e.Button = Windows.Forms.MouseButtons.Left Then
    13. _dragInit = True
    14. End If
    15. End Sub
    16. Private Sub ListView1_DragEnter(sender As Object, e As DragEventArgs) Handles ListView1.DragEnter
    17. If e.Data.GetDataPresent(GetType(ListView.SelectedListViewItemCollection)) Then
    18. e.Effect = DragDropEffects.All
    19. End If
    20. End Sub
    21. Private Sub ListView1_DragDrop(sender As Object, e As DragEventArgs) Handles ListView1.DragDrop
    22. Dim items As ListView.SelectedListViewItemCollection = DirectCast(e.Data.GetData(GetType(ListView.SelectedListViewItemCollection)), ListView.SelectedListViewItemCollection)
    23. Dim dropCoord As Point = ListView1.PointToClient(New Point(e.X, e.Y))
    24. Dim target As ListViewItem = ListView1.GetItemAt(dropCoord.X, dropCoord.Y)
    25. If Not target Is Nothing Then
    26. If items.Contains(target) Then
    27. MessageBox.Show("Ziel ist Teil der Auflistung")
    28. Exit Sub
    29. End If
    30. For Each lVI As ListViewItem In items
    31. 'Do your stuff.
    32. Next
    33. End If
    34. End Sub
    35. Private Sub ListView1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView1.MouseMove
    36. If _dragInit Then
    37. ListView1.DoDragDrop(ListView1.SelectedItems, DragDropEffects.Copy)
    38. End If
    39. End Sub
    40. Private Sub ListView1_MouseUp(sender As Object, e As MouseEventArgs) Handles ListView1.MouseUp
    41. If e.Button = Windows.Forms.MouseButtons.Left Then
    42. _dragInit = False
    43. End If
    44. End Sub
    45. End Class



    Ich arbeite auch nie mit dem ListView-Control und ich rate meist auch jedem davon ab. Aber gut, in diesem Fall scheint es, als ob man es einsetzen kann.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    @ErfinderDesRades:

    Ich war mir nicht so sicher, ob er das Design, das er in seinem Screenshot zeigt, mit einem DGV umgesetzt bekommt. Darum die Aussage.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Du musst bei deiner Lösung übrigens aufpassen, weil da kann auch aus ListViews anderer Anwendungen drauf gezogen werden - in Produktiv-Anwendungen vlt. nicht so prickelnd.

    gugge vlt. DragDropSample

    ach - ist auch blödes Sample, wasses ja garnet anners macht.
    jetzt fällt mir nurnoch was altes in c# ein: Draggen in der Anwendung
    Mhh, interessant. Aber wird, wenn der Drop von "außerhalb" kommt, nicht etwas in der Art "COM-Object" übergeben? Das sollte ja dann zu einer Ausnahme führen. Man müsste ja nur den Typ prüfen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX
    Danke, hat super Funktioniert. Noch hier und da ein bisschen angepasst, aber jetzt funktionierts!
    DANKE!

    Und was it DGV ?

    @ErfinderDesRades
    Ich werde durch den Code nicht schlau. Wo wird denn angegeben, dass nicht aus anderen Anwendungen gedropped werden kann?

    @SpaceyX
    Wie sollte man das denn Prüfen?

    Lg!
    ...aber gut, dass wir darüber gesprochen haben!
    Ich würde gleich im DragEnter-EventHandler prüfen und "fremde" Objecte gar nicht erst weiter verarbeiten. In Etwa so:

    VB.NET-Quellcode

    1. Private Sub ListView1_DragEnter(sender As Object, e As DragEventArgs) Handles ListView1.DragEnter
    2. Dim i As Object = e.Data.GetData(GetType(ListView.SelectedListViewItemCollection))
    3. If TypeOf (i) Is ListView.SelectedListViewItemCollection Then
    4. e.Effect = DragDropEffects.All
    5. Else
    6. e.Effect = DragDropEffects.None
    7. End If
    8. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Der Erfinder meinte eigentlich, dass nicht aus ListViews anderer Anwendungen heraus auf Deine ListView gedroppt werden kann. Jedenfalls hab ich das so verstanden. Hier noch ein Codeausschnitt, der das Droppen aus der eigenen ListView und das Droppen von Dateien zulässt. Im DragDrop-EventHandler musst Du dann die Fallunterscheidung durchfürhen. Aber ich denke, Du bekommst das schon hin.

    VB.NET-Quellcode

    1. Private Sub ListView1_DragEnter(sender As Object, e As DragEventArgs) Handles ListView1.DragEnter
    2. Dim t As Type = e.Data.GetType()
    3. 'Verhindert, dass aus anderen Anwendungen gedroppt wird.
    4. 'Jedenfalls weiß ich es nicht besser!
    5. If Not t.IsCOMObject Then
    6. e.Effect = DragDropEffects.All
    7. Else
    8. e.Effect = DragDropEffects.None
    9. End If
    10. End Sub
    11. Private Sub ListView1_DragDrop(sender As Object, e As DragEventArgs) Handles ListView1.DragDrop
    12. If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    13. Dim droppedFiles As String() = DirectCast(e.Data.GetData(DataFormats.FileDrop), String())
    14. For Each s As String In droppedFiles
    15. 'Do your stuff with dropped files
    16. Next
    17. End If
    18. If e.Data.GetDataPresent(GetType(ListView.SelectedListViewItemCollection)) Then
    19. Dim items As ListView.SelectedListViewItemCollection = DirectCast(e.Data.GetData(GetType(ListView.SelectedListViewItemCollection)), ListView.SelectedListViewItemCollection)
    20. Dim dropCoord As Point = ListView1.PointToClient(New Point(e.X, e.Y))
    21. Dim target As ListViewItem = ListView1.GetItemAt(dropCoord.X, dropCoord.Y)
    22. If Not target Is Nothing Then
    23. If items.Contains(target) Then
    24. MessageBox.Show("Ziel ist Teil der Auflistung")
    25. Exit Sub
    26. End If
    27. For Each lVI As ListViewItem In items
    28. 'Do your stuff.
    29. Next
    30. End If
    31. End If
    32. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hey @SpaceyX
    Ich weiß nun dank deinem Code wie sowas zu realisieren ist. Ist es auch möglich, rauszufinden wenn etwas, z.B. aus der ListView, auf den Desktop gedropped wird?
    Den Desktop kann ich ja schlecht mit einer Sup Desktop_DragEnter(...)... machen.

    Vlt ein paar Stichwörter oder Starthilfen, Ansätze?


    Lg
    ...aber gut, dass wir darüber gesprochen haben!
    Hey.
    Unmöglich ist es ja nicht, es gibt ja sehr viele Anwendungen die Drag'n Drop auf den Desktop oder sonst wo hin unterstützen.
    Nur wüsste ich nicht WIE die das machen, das ist ja meine Frage, wie ich den Pfad bekomme, auf das ein ListViewItem gezogen wurde. Beispiel: Desktop
    Wenn es eine andere Möglichkeit gibt, als den Pfad zu bekommen, z.B. direkt Kopieren, ist das auch super :)

    Vlt. haben wir uns nicht ganz verstanden?
    ...aber gut, dass wir darüber gesprochen haben!
    @ErfinderDesRades
    Welches DataObject?
    Ist das erste mal, dass ich mit D'nD arbeite, brauche noch Unterstützung.
    Code ist zwar cool, allerdings würd ichs auch gern mit dem MSDN oder sonstigem Versuchen, C&P ist ja auch doof, daraus lern ich nichts :(
    Ich hab schon gegooglet. Dabei sind teilweise 4 Jahre alte Themen rausgekommen und die funktionierten nicht oder waren garnicht erst für VB...

    @sonne75
    Wenn das ginge, wär das natürlich auch nicht schlecht, da bin ich noch garnicht drauf gekommen.

    Lg
    ...aber gut, dass wir darüber gesprochen haben!
    Ich habe dir ein einfaches funktionierendes Codebeispiel gegeben, innerhalb eines Tutorials, wo der Kram erläutert wird (dort post#8). Mehr Unterstützung weiß ich nicht, wie man dir bieten können sollte.
    Nun musst du gucken, ob du auf einem Level bist, der die Erklärungen versteht, oder du mußt die fehlenden Grundlagen nacharbeiten.
    Auch möglich ist, dass meine Erklärungen nicht gut sind (ich kann ja nur vermuten, was die beste Erklärung ist)
    All das kann man aber nur herausfinden, indem du nachfragst.

    Wenn du lieber mit Msdn lernst- bitte.

    Also für mein Geschmack wesentlich schwieriger zu verstehen, und auch einiger Müll drin, etwa unsinnige Abfragen, und ein unsinniger TryCatch.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades
    Ich komm damit wirklich nicht weiter.
    Da wird zwar erläutert, wie Drag'n Drop funktioniert, aber so wie ich das gesehen hab, nicht wie es z.B. mit dem Windows Explorer, Desktop zu realisieren ist... :(
    Und, du hast recht, der ist echt Shit, also MSDN...
    Ich arbeite aber auch viel mit Try Catch, was ist daran so schlimm?

    Lg
    ...aber gut, dass wir darüber gesprochen haben!