| |
VB.NET - Ein- und UmsteigerDragDrop im DGV auf Zeilenkenner für neue Zeile | | | Autor: Bazi | Datum: 04.04.21 10:11 |
| Hallo, ich brauche mal wieder Hilfe.
Ich möchte mit DragDrop Daten in einem DataGridView anhängen, aber nur wenn auf die mit * markierte letzte Zeile im DGV gezogen wird.
Mit HitTest komme ich da nicht weiter, und auch die Berechnung der letzten Zeile und DisplayRectangle scheiterte bislang.
Könnt Ihr mir bitte sagen wie ich ermittle ob ich im DragEnter auf dieser speziellen Zeile im DGV bin?
Danke im Voraus
Danke für die Hilfe
Gruß Christian | |
Re: DragDrop im DGV auf Zeilenkenner für neue Zeile | | | Autor: Bazi | Datum: 04.04.21 10:38 |
| so scheint es zu funktionieren
Private Sub ZeitenDataGridView_DragEnter(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DragEventArgs) Handles ZeitenDataGridView.DragEnter
Dim cp = Cursor.Position
Dim pt = ZeitenDataGridView.PointToScreen( _
ZeitenDataGridView.GetCellDisplayRectangle(1, _
ZeitenDataGridView.Rows.Count - 1, True).Location)
pt.Y += ZeitenDataGridView.RowTemplate.Height
If cp.Y < pt.Y Then
e.Effect = DragDropEffects.None
ElseIf cp.Y > pt.Y AndAlso cp.X > pt.X AndAlso _
e.Data.GetDataPresent(DataFormats.StringFormat, True) Then
e.Effect = DragDropEffects.All
End If
End Sub Leider gibt es kein Cell_DragEnter, dann könnte ich noch abfragen auf welche Spalte gezogen wird.
Danke für die Hilfe
Gruß Christian | |
Re: DragDrop im DGV auf Zeilenkenner für neue Zeile | | | Autor: Manfred X | Datum: 04.04.21 15:14 |
| Hallo!
"HitTestInfo" liefert alle erforderlichen Informationen.
Hier ein einfaches Beispiel, bei dem nur die Werte aus
Integer-Zellen im Ziel auf Integer-Zellen und die Werte aus
Double-Zellen im Ziel auf Double-Zellen abgelegt werden können.
Die Funktion CheckDestinationCell kannst Du für Deine Zwecke
anpassen.
Public Class frmDGVDragDrop
Dim WithEvents dgvSource As New DataGridView With
{.Parent = Me, .Location = New Point(10, 10), .Size = New Drawing.Size( _
300, 300)}
Dim dtsource As New DataTable
Dim WithEvents dgvDestination As New DataGridView With
{.Parent = Me, .Location = New Point(310, 10), .Size = New Drawing.Size( _
300, 300)}
Dim dtDestination As New DataTable
Dim Source_ClickedCell As DataGridViewCell
Private Sub frmDGVDragDrop_Load(sender As Object, e As EventArgs) Handles _
MyBase.Load
Me.Size = New Size(630, 400)
With dtSource
.Columns.Add("AAA", GetType(Integer))
.Columns.Add("BBB", GetType(Double))
.Rows.Add(1, 123.45)
.Rows.Add(2, 678.9)
End With
With dtDestination
.Columns.Add("XXX", GetType(Double))
.Columns.Add("YYY", GetType(Integer))
.Rows.Add(1, 54.321)
.Rows.Add(2, 9.876)
End With
dgvSource.DataSource = dtsource
dgvDestination.DataSource = dtDestination
dgvDestination.AllowDrop = True
End Sub
Private Sub dgvSource_MouseMove(sender As Object, e As MouseEventArgs) _
Handles dgvSource.MouseMove
If (e.Button And MouseButtons.Right) = MouseButtons.Right Then
Dim dropeffect As DragDropEffects =
dgvSource.DoDragDrop(Source_ClickedCell, DragDropEffects.Copy)
End If
End Sub
Private Sub dgvSource_MouseDown(sender As Object, e As MouseEventArgs) _
Handles dgvSource.MouseDown
If e.Button = MouseButtons.Right Then
Dim hti As DataGridView.HitTestInfo = dgvSource.HitTest(e.X, e.Y)
If hti.Type = DataGridViewHitTestType.Cell Then
Source_ClickedCell = dgvSource.Rows(hti.RowIndex).Cells( _
hti.ColumnIndex)
Else
Source_ClickedCell = Nothing
End If
End If
End Sub
Private Sub dgvSource_MouseUp(sender As Object, e As MouseEventArgs) _
Handles dgvSource.MouseUp
Source_ClickedCell = Nothing
End Sub
Private Sub dgvDestination_DragOver(sender As Object, e As DragEventArgs) _
Handles dgvDestination.DragOver
If CheckDestinationCell(e) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
End Sub
Private Sub dgvDestination_DragDrop(sender As Object, e As DragEventArgs) _
Handles dgvDestination.DragDrop
Dim destinationcell As DataGridViewCell
If CheckDestinationCell(e, destinationcell) Then
destinationcell.Value = Source_ClickedCell.Value
End If
End Sub
Private Function CheckDestinationCell(e As DragEventArgs,
Optional ByRef DestinationCell As DataGridViewCell = Nothing) As Boolean
DestinationCell = Nothing
If Not e.Data.GetDataPresent(GetType(DataGridViewTextBoxCell)) Then
Return False
ElseIf (e.AllowedEffect And DragDropEffects.Copy) = _
DragDropEffects.Copy Then
Dim c As Point = dgvDestination.PointToClient(New Point(e.X, e.Y))
Dim hti As DataGridView.HitTestInfo = dgvDestination.HitTest(c.X, _
c.Y)
If hti.Type = DataGridViewHitTestType.Cell Then
Dim TestCell As DataGridViewCell =
dgvDestination.Rows(hti.RowIndex).Cells(hti.ColumnIndex)
If TestCell.ValueType = Source_ClickedCell.ValueType AndAlso
hti.RowIndex = dgvDestination.Rows.Count - 1 Then
Me.Text = hti.RowIndex.ToString
DestinationCell = TestCell : Return True
End If
End If
End If
Return False
End Function
End Class | |
Re: DragDrop im DGV auf Zeilenkenner für neue Zeile | | | Autor: Bazi | Datum: 04.04.21 21:50 |
| Hallo Manfred,
HitTestInfo liefert mir bei dieser speziellen Zeile am Ende des DGV einen RowIndex -1, ColumnIndex -1 und eine HitTestType None.
Bei allen anderen Zellen geht das, aber leider nicht bei dieser Zeile.
Ich möchte in meinem Programm der Arbeitszeiterfassung die Kalendereinträge per DragDrop auf eben diese Sonderzeile ziehen und damit anhängen.
Mit meiner vorhin geposteten Lösung funktioniert es soweit.
Danke Dir für die Hilfe. Der Code ist trotzdem sehr hilfreich für mich.
Danke für die Hilfe
Gruß Christian | |
Re: DragDrop im DGV auf Zeilenkenner für neue Zeile | | | Autor: Manfred X | Datum: 05.04.21 11:22 |
| Die Zeile, auf die Du Daten "dropen" möchtest, ist nur als
Option für den User-Dialog, aber nicht tatsächlich in der Tabelle
vorhanden.
Erst wenn der Benutzer dort einen Zellinhalt mit "Return"
bestätigt hat, wird die Zeile (falls der Inhalt den Tabellenvorgaben
entspricht) tatsächlich zum Bestandteil der Tabelle.
Aus diesem Grund macht es kaum Sinn, Daten auf dieser Zeile
abzulegen. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|