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
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top