DataGridView Drag&Drop mehrere Varianten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    DataGridView Drag&Drop mehrere Varianten

    Hallo zusammen.
    Ich hab mich gerade hier ein bisschen durch gehangelt. -> drag & drop mehrere Zeile im Datagridview
    Gibt's die Möglichkeit die "Destination-Row" oder Zelle zu bekommen, wo der Drop landen wird?

    Im Beispiel geht's ja um nen TreeNode, den bekommt man mit Dim nd = TreeView1.GetNodeAt(TreeView1.PointToClient(Control.MousePosition)), sowas bräuchte ich für die Row bzw. die Zelle, leider
    find ich keine passende Methode.

    Ich hab vor von einem 2. DataGridView vorhandene Touren in einen Planer (1. DataGridView) zu ziehen. Dabei brauch ich beide Rows (sender und empfänger),
    damit ich die ziel-row entsprechend manipulieren kann. Wenn das klappt, dann will ich später innerhalb des 1. DataGridViews Rows nach oben oder unten verschieben können (bei beiden Beispielen immer nur 1 Row! - keine Multiple Rows),
    auch dabei brauch ich wieder beide rows ;)

    Könnt ihr mir hier weiterhelfen? Achja, die Sender-Row wäre ja dann die markierte - da komm ich zumindest schonmal ran :P

    LG
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    ErfinderDesRades schrieb:

    heisst die entsprechende Methode DGV.HitTest()

    jo, danke - wird wohl das sein was ich gesucht hab. Nur leider bekomm ich nicht die richtige Row, sondern eine die 4-5 Zeilen darunter liegt...

    Das hier hab ich bis jetzt, der Highlighter markiert auch irgendwas oben links bei den Headern und nicht die Zelle, über der ich mit der Maus bin ?(

    VB.NET-Quellcode

    1. Private _DragStart As Point
    2. Private _DummiData As New DataObject
    3. Private Sub dgv_MouseDown(sender As Object, e As MouseEventArgs) Handles dgvAuswahl.MouseDown
    4. Dim dgv = DirectCast(sender, DataGridView)
    5. If e.Button <> MouseButtons.Left OrElse dgv.SelectedRows.Count = 0 Then Return
    6. _DragStart = e.Location
    7. End Sub
    8. Private Sub dgv_MouseMove(sender As Object, e As MouseEventArgs) Handles dgvAuswahl.MouseMove
    9. If e.Button <> MouseButtons.Left Then Return
    10. With e.Location 'draggen erst starten, wenn ein kleines Stück mit gehaltener Maustaste gezogen wurde
    11. If (.X - _DragStart.X) ^ 2 + (.Y - _DragStart.Y) ^ 2 > 9 Then
    12. Dim result = dgvAuswahl.DoDragDrop(_DummiData, DragDropEffects.Move)
    13. If result = DragDropEffects.Move Then
    14. ' Hier Drop-Aktion ausführen
    15. Dim hitTestInfo = dgvTourenplan.HitTest(e.X, e.Y) 'Control.MousePosition.X, Control.MousePosition.Y)
    16. Dim cell = dgvTourenplan.Rows(hitTestInfo.RowIndex).Cells(hitTestInfo.ColumnIndex)
    17. Dim i = 1
    18. End If
    19. Highlighter.Off()
    20. AddHandler dgvTourenplan.SelectionChanged, AddressOf dgv_SelectionChanged
    21. End If
    22. End With
    23. End Sub
    24. Private Sub dgv_DragOver(sender As Object, e As DragEventArgs) Handles dgvTourenplan.DragOver
    25. Dim hitTestInfo = dgvTourenplan.HitTest(e.X, e.Y) 'Control.MousePosition.X, Control.MousePosition.Y)
    26. If hitTestInfo.Type <> DataGridViewHitTestType.Cell Then Return
    27. RemoveHandler dgvTourenplan.SelectionChanged, AddressOf dgv_SelectionChanged
    28. Dim cell = dgvTourenplan.Rows(hitTestInfo.RowIndex).Cells(hitTestInfo.ColumnIndex)
    29. If cell Is Nothing Then
    30. Highlighter.Off()
    31. e.Effect = DragDropEffects.None
    32. Else
    33. e.Effect = DragDropEffects.Move
    34. Highlighter.Highlight(dgvTourenplan, cell.ContentBounds)
    35. End If
    36. End Sub
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    das mit der MausPosition ist knifflig. Bei MouseDown/Move ist sie DGV-Bezogen, bei DragOver Bildschirmbezogen.
    dassis wohl der Grund, warum ich immer mit Control.MousePosition arbeite - dann ist einheitlich bildschirmbezogen.
    Es gibt Umrechnungsmethoden: Control.PointToClient/.RechtangleTo/Client/Screen
    feste studieren meine Tuts zu Draggen in Anwendung
    Hmm.

    VB.NET-Quellcode

    1. Private Sub ItemDataGridView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ItemDataGridView.MouseDown
    2. If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    3. _DragStart = e.Location
    4. End Sub
    5. Private Sub ItemDataGridView_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ItemDataGridView.MouseMove
    6. If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    7. With e.Location 'draggen erst starten, wenn ein kleines Stück mit gehaltener Maustaste gezogen wurde
    8. If (.X - _DragStart.X) ^ 2 + (.Y - _DragStart.Y) ^ 2 > 9 Then
    9. _DgvSelectionStore.Restore()
    10. Dim dgv = ItemDataGridView
    11. Dim result = dgv.DoDragDrop(_DummiData, DragDropEffects.Copy)
    12. If result <> DragDropEffects.None Then
    13. ' Hier Drop-Aktion ausführen - ***nicht*** im Treeview.DragDrop-Event!!!
    14. Dim nd = TreeView1.GetNodeAt(TreeView1.PointToClient(Control.MousePosition))
    15. If nd IsNot Nothing Then
    16. MessageBox.Show("dropped on: " & nd.Text)
    17. Else
    18. Dim cell = GetCellFromMouse(dgv)
    19. MessageBox.Show($"dropped on: {cell.Value}")
    20. End If
    21. End If
    22. Highlighter.Off()
    23. End If
    24. End With
    25. End Sub
    26. Private Sub ItemDataGridView_DragOver(sender As Object, e As DragEventArgs) Handles ItemDataGridView.DragOver
    27. e.Effect = DragDropEffects.None
    28. Dim dgv = ItemDataGridView
    29. Dim cell = GetCellFromMouse(dgv)
    30. If cell Is Nothing OrElse dgv.SelectedCells.Contains(cell) Then Return
    31. e.Effect = DragDropEffects.Copy
    32. Highlighter.Highlight(dgv, dgv.GetCellDisplayRectangle(cell.ColumnIndex, cell.RowIndex, True))
    33. End Sub
    34. Private Shared Function GetCellFromMouse(dgv As DataGridView) As DataGridViewCell
    35. Dim pt = dgv.PointToClient(MousePosition)
    36. Dim ht = dgv.HitTest(pt.X, pt.Y)
    37. If ht.Type <> DataGridViewHitTestType.Cell Then Return Nothing
    38. Return dgv(ht.ColumnIndex, ht.RowIndex)
    39. End Function
    Dateien
    @ErfinderDesRades: Jo, danke.
    Keine Ahnung, wo ich da den Denkfehler hatte. Klappt nun mit der Auswahl - dann kann ich ja jetzt mal weiter basteln :)

    Edit: Funktioniert nun alles, wie es soll. Danke nochmal :thumbup:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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