Wie ich verhindern ‚Selbst‘ Drag & Drop in einem Datagridview?
-
03-07-2019 - |
Frage
Ich bin die Umsetzung Drag & Drop-Funktionalität zwischen zwei datagridviews. Dies funktioniert wie mit einer Ausnahme gedacht: es möglich ist, innerhalb des gleichen Datagridview zu ziehen. Dies führt zu duplizierten Zeilen. Ich mag die Funktionalität begrenzen, so dass ich nur von einem Datagridview auf einem anderen ziehen. Wer weiß, wie dies erreicht werden kann? Ich bin eine Art Treffertest rate erforderlich ist, aber ich bin nicht sicher, wie dies zu implementieren ...
Der Code Ich verwende ist wie folgt:
Private Sub dgvFMAvailable_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgvFMAvailable.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Me.dgvFMAvailable.DoDragDrop(Me.dgvFMAvailable.SelectedRows, DragDropEffects.Move)
End If
End Sub
und
Private Sub dgvFMSelected_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles dgvFMSelected.DragDrop
Try
Me.SelectFM(CType(e.Data.GetData(GetType(DataGridViewSelectedRowCollection)), DataGridViewSelectedRowCollection))
Finally
e.Effect = DragDropEffects.None
End Try
End Sub
Lösung
Nur eine schnelle Idee. Was passiert, wenn, wenn Sie die Drag starten Sie den Namen des Ursprungs Gitter halten. Wenn Sie die Tropfen tun überprüfen Sie den Namen, wenn sie das gleiche Objekt sind dann nicht erlauben, den Abfall.
Andere Tipps
Einfach testen Referenz Gleichheit beim Löschen. So etwas wie folgt aus:
If Object.ReferenceEquals(droppedThing, thingWhereItWasDropped)
' Don't drop it
Else
' Drop it
End If
Ich konnte nicht eine gute Antwort für diese finden, obwohl es scheint, wie es ein häufig auftretendes Problem sein muss. So habe ich gbianchi Antwort auf folgende Weise:
public bool DraggingFromFileLinkDGV { get; set; }
void grdFiles_MouseDown(object sender, MouseEventArgs e)
{
this.DraggingFromFileLinkDGV = true;
}
void grdFiles_MouseLeave(object sender, EventArgs e)
{
this.DraggingFromFileLinkDGV = false;
}
void grdFiles_DragDrop(object sender, DragEventArgs e)
{
// Avoid DragDrop's on jittery DoubleClicks
if (this.DraggingFromFileLinkDGV) return;
// Your DragDrop code here ...
}
Nun, ich habe eigentlich das spezifisch „Wandern“ Doppelklicks zu verhindern, wo die Maus ein wenig zwischen einem Doppelklick bewegt. Dies verhindert, dass Doppelklicks Registrierung als Drag Tropfen sowie die Beantwortung der OPs Frage.
Wohlgemerkt, es scheint nicht 100% der Zeit zu arbeiten. Offenbar einige Ereignisse in wie 1 20 Fälle „verloren“ sind. Ich habe nicht genau identifiziert, was in solchen Situationen variiert, wo es einen Tropfen auf sich selbst registriert. Im Fall von Doppelklicks zu verhindern, wie Drag Tropfen Registrierung ist 95% gut genug, weil es nur in Kraft gesetzt wurde den Ärger zu vermeiden. Wenn Sie brauchen etwas, das zu 100% wirksam ist, können Sie haben, etwas anderes versuchen, oder herauszufinden, warum es nicht in den wenigen Fällen funktioniert.
Eine Möglichkeit ist eine Zeichenfolge Beschreibung zu speichern, was Sie in dem Datenobjekt schleppen, wenn Sie anfangen zu ziehen, das heißt:
Dim dataObj As New DataObject
...
dataObj.SetText(G_SELF_DRAG_DROP_FLAG)
Dann auf Dragenter überprüfen, um zu sehen, ob das Flag vorhanden ist:
Public Sub ProcessAttachment_DragEnter(ByRef e As System.Windows.Forms.DragEventArgs)
' prevent dragging onto self
Dim s = e.Data.GetData(DataFormats.Text)
If s IsNot Nothing Then
If s.contains(G_SELF_DRAG_DROP_FLAG) Then
e.Effect = DragDropEffects.None
Exit Sub
End If
End If
...
End Sub
Zur Einstellung des Flag auf False in dem MouseLeave
Ereignisse nicht funktionierte richtig für mich. MouseLeave
gehalten, so bald genannt zu werden, wie ich DoDragDrop
genannt.
Ich habe es schließlich Recht auf Arbeit wie folgt:
A) I create a private bool DraggingFromHere flag
B) Right before calling DoDragDrop, I set this.DraggingFromHere = true
C) In the MouseUp event, I set this.DraggingFromHere = false
D) In the DragDro event, I simply to this:
if(this.DraggingFromHere) return;
Carlos A Merighe