Pregunta

Estoy implementando la funcionalidad de arrastrar y soltar entre dos vistas de datos de datos. Esto funciona como se pretende con una excepción: es posible arrastrar y soltar dentro de la misma vista de datos. Esto da lugar a filas duplicadas. Quiero limitar la funcionalidad para que solo pueda arrastrar de una vista de datos a otra. ¿Alguien sabe cómo se puede lograr esto? Supongo que se requiere algún tipo de prueba de impacto, pero no estoy seguro de cómo implementar esto ...

El código que estoy usando es el siguiente:

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

y

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
¿Fue útil?

Solución

Sólo una idea rápida. Qué sucede si al iniciar el arrastre se mantiene el nombre de la cuadrícula de origen. Cuando haga la caída, verifique el nombre, si son el mismo objeto, entonces no permita la caída.

Otros consejos

Simplemente pruebe la igualdad de referencia al soltar. Algo como esto:

If Object.ReferenceEquals(droppedThing, thingWhereItWasDropped)
    ' Don't drop it
Else
    ' Drop it
End If

No pude encontrar una buena respuesta para esto, aunque parece ser un problema común. Así que utilicé la respuesta de gbianchi de la siguiente manera:

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 ...
}

Ahora, en realidad lo hice específicamente para evitar " vagar " Haga doble clic donde el ratón se mueve un poco entre un doble clic. Esto evita que los clics dobles se registren a medida que se arrastre y se responda a la pregunta de los OP.

Eso sí, no parece funcionar el 100% del tiempo. Al parecer, algunos eventos se han perdido " " En como 1 de 20 casos. No he identificado exactamente qué varía en aquellas situaciones en las que registra una caída sobre sí misma. En el caso de evitar que los clics dobles se registren cuando se arrastre, el 95% es lo suficientemente bueno porque se estaba poniendo en marcha para evitar la molestia. Si necesita algo que sea 100% efectivo, es posible que tenga que probar algo más o averiguar por qué no funciona en esos pocos casos.

Una forma es almacenar una descripción de cadena de lo que está arrastrando en el objeto de datos cuando comienza a arrastrar, es decir:

Dim dataObj As New DataObject
...
dataObj.SetText(G_SELF_DRAG_DROP_FLAG)

Luego, en DragEnter, compruebe si la bandera está allí:

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

Establecer el indicador en falso en el evento MouseLeave no funcionó correctamente para mí. Se siguió llamando a MouseLeave tan pronto como llamé a DoDragDrop .

Finalmente conseguí que funcionara correctamente de la siguiente manera:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top