vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
DragDrop 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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2021 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel