Drag and Drop Listboxeintrag in eine Datagridviewzelle

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von toeller.

    Drag and Drop Listboxeintrag in eine Datagridviewzelle

    Hallo Zusammen,

    ist es möglich, einen Eintrag einer Listbox per Drag and Drop an eine bestimme Datagridviewzelle zu ziehen?

    Den Code zum Ziehen eines Eintrages aus einer Listbox in eine Textbox habe ich hier im Forum bereits einen Code vom Erfinder des Rades gefunden. Dieser nützt mir leider nichts, weil ich wie bereits gesagt von einer Listbox den Eintrag in eine Datagridviewzelle ziehen möchte und umgekehrt, also vom Datagridview zurück in die Listbox.

    Für eine Hilfe wäre ich sehr dankbar.

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

    Es gibt kein Zell-Drop.
    Du musst im DragDrop-Event des DGV einfach die richtige Zelle auswählen.
    Möglicherweise kannst Du aus der Drop-Mausposition die Zelle bestimmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für dien Antworten,

    da müsste ich ja folgender Code gar nicht so schlecht sein für den Anfang oder:

    VB.NET-Quellcode

    1. Private clickedCell As DataGridViewCell
    2. Private Sub dataGridView1_MouseDown(ByVal sender As Object, _
    3. ByVal e As MouseEventArgs) Handles DataGridView1.MouseDown
    4. If e.Button = MouseButtons.Right Then
    5. Dim hit As DataGridView.HitTestInfo = _
    6. dataGridView1.HitTest(e.X, e.Y)
    7. If hit.Type = DataGridViewHitTestType.Cell Then
    8. clickedCell = _
    9. dataGridView1.Rows(hit.RowIndex).Cells(hit.ColumnIndex)
    10. End If
    11. End If
    12. End Sub




    Bekomme es leider nicht hin, einen Listboxeintrag in eine Datagridview, bzw. vom Datagridview in eine Listbox zu ziehen. Ist mir wahrscheinlich noch zu schwierig, weil ich habe erst in diesem Jahr mit der Programmierer begonnen.



    Oder wär es einfacher zu realisieren, eine Zeile aus einer Listbox in ein Listview zu ziehen. Ich brächte dort (Listview) allerdings nachdem die Zeile von der Listbox in das Listview gezogen worden ist noch 4 zusätzliche Spalten mit Checkboxen.



    Kurz die Situation. In der Listbox werden vom Benutzer über eine Textbox alle Aufträge eingegeben. Der Disponent sollte jetzt per Drag and Drop die eingegebenen Aufträge aus der Listbox den einzelnen Fahrzeugen zuordnen. Wenn ein Auftrag einem Fahrzeug zugeordnet wurde, braucht man auch noch 4 zusätzliche Checkboxen daneben, damit der aktuelle Status immer angehackt werden kann. Wie gesagt, ich weiß jetzt nicht, ob das über ein Listview auch zu realisieren ist.

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

    VB.NET-Quellcode

    1. Private clickedCell As DataGridViewCell
    2. Private Sub dataGridView1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles DataGridView1.MouseDown
    3. If e.Button = MouseButtons.Right Then
    4. Dim hit As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)
    5. If hit.Type = DataGridViewHitTestType.Cell Then
    6. clickedCell = DataGridView1.Rows(hit.RowIndex).Cells(hit.ColumnIndex)
    7. End If
    8. End If
    9. End Sub


    Ich hoffe ich habe das jetzt richtigt verstanden und jetzt richtig gemacht.
    was hast du mit dem DGV-MouseDown-Event vor? Ich denk das DGV ist das Ziel-Control, wo allenfalls ein Dropped-Event von Belang sein könnte.

    Ich empfehle ja, dieses (das Dropped-Event) auch nicht zu verwenden, sondern die ganze Geschichte dort zu beenden, wo sie auch anfing, nämlich im MouseMove der Listbox (oder wo startest du das Draggen?)
    DragnDrop innerhalb der Anwendung
    Mein ursprünglich als Basis genommer Quellcode war ja der vom Erfinder des Rades:

    VB.NET-Quellcode

    1. Private _GrabOffset As Size
    2. Private Const _Tolerance As Double = 5 ^ 2
    3. #Region "receive Drop"
    4. Private Sub Control_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) _
    5. Handles ListBox1.DragOver, TextBox1.DragOver
    6. 'erlaubte DropEffects festlegen
    7. Dim eff = If(Control.ModifierKeys.HasFlag(Keys.Control), DragDropEffects.Copy, DragDropEffects.Move)
    8. Select Case True
    9. Case sender Is ListBox1
    10. If TypeOf e.Data.GetData(DataFormats.FileDrop) Is IEnumerable(Of String) Then e.Effect = e.AllowedEffect And eff
    11. Case sender Is textbox1
    12. If TypeOf e.Data.GetData(DataFormats.Text) Is String Then e.Effect = e.AllowedEffect And eff
    13. End Select
    14. End Sub
    15. Private Sub Control_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) _
    16. Handles TextBox1.DragDrop, ListBox1.DragDrop
    17. 'auf Datenempfang reagieren
    18. Select Case True
    19. Case sender Is textbox1
    20. 'zum Testen kann Text aussm VS-Editor auf die Textbox gezogen werden
    21. Dim txt As String = DirectCast(e.Data.GetData(DataFormats.Text), String)
    22. TextBox1.AppendText(txt & Environment.NewLine)
    23. Case sender Is ListBox1
    24. 'zum Testen können Dateien/Ordner aussm DateiBrowser auf die ListBox gezogen werden
    25. For Each fl As String In DirectCast(e.Data.GetData(DataFormats.FileDrop), IEnumerable(Of String))
    26. ListBox1.Items.Add(fl)
    27. Next
    28. End Select
    29. Label1.Text = String.Concat("drop item(s) on ", sender.GetType.Name, ", with DropEffect.", e.Effect)
    30. End Sub
    31. #End Region 'receive Drop
    32. #Region "send DragDrop"
    33. Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ListBox1.MouseDown
    34. If e.Button = MouseButtons.Left Then _GrabOffset = New Size(e.Location)
    35. End Sub
    36. Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ListBox1.MouseMove
    37. If Not e.Button.HasFlag(MouseButtons.Left) Then Return
    38. With e.Location - _GrabOffset
    39. If .X ^ 2 + .Y ^ 2 > _Tolerance Then
    40. PerformDragFileItem(Point.Empty + _GrabOffset)
    41. End If
    42. End With
    43. End Sub
    44. Private Sub PerformDragFileItem(ByVal pt As Point)
    45. Dim indx = ListBox1.IndexFromPoint(pt)
    46. If indx < 0 Then Return
    47. Dim file = DirectCast(ListBox1.Items(indx), String)
    48. Dim dto = New DataObject(DataFormats.FileDrop, {file}) 'DataObject mit FileDropList
    49. dto.SetData(DataFormats.StringFormat, file) 'Daten zusätzlich außerdem als Text einpacken
    50. Dim allowed = DragDropEffects.Copy Or DragDropEffects.Move
    51. If ListBox1.DoDragDrop(dto, allowed) = DragDropEffects.Move Then
    52. ListBox1.Items.RemoveAt(indx)
    53. End If
    54. End Sub
    55. #End Region 'send DragDrop


    Jetzt habe ich die ganze Zeit rumgespielt und rumprobiert und bin dabei irgendwie auf den Code mit dem MouseDown gekommen. Es ist wahrscheinlich wirklich das Beste, diesen obigen Code anzupassen, so dass das mit dem Drag and Drop funktioniert.
    Dein Vorschlag könnte schon besser sein, jedoch fehlt mir leider das Wissen dazu, so etwas selber zu machen. Deshalb dachte ich, es wird eventuell leichter, wenn ich als Basis den Code für das Drag and Drop von einer Listbox zu einer Textbox benutze und dann versuche den irgendwie abzuändern. Wenn ich ehrlich bin, habe ich auch dabei meine Zweifel ob ich das hinbekomme.
    na, sowohl vom DGV als auch vonne Listbox musst du den SelectedIndex haben.
    Und dann das Item am SelectedIndex des einen an den SelectedIndex des anneren inserten.

    Ich hab den Eindruck, man muß die gesamte Geschichte an deiner Stelle programmieren, statt dir dabei zu helfen.