Pergunta

Estou implementando arrastar e funcionalidade queda entre dois DataGridViews. Isso funciona como pretendido com uma exceção: é possível arrastar e soltar dentro da mesma datagridview. Isso resulta em linhas duplicadas. Eu quero limitar a funcionalidade de modo que eu só posso arrastar de um datagridview para outro. Alguém sabe como isso pode ser alcançado? Eu estou supondo que algum tipo de teste de visitas é necessária, mas não tenho certeza de como implementar isso ...

O código que estou usando é a seguinte:

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

e

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
Foi útil?

Solução

Apenas uma idéia rápida. E se quando você começa a arrastar você segure o nome da rede de origem. Quando você fazer a queda de verificar o nome, se eles são o mesmo objeto, em seguida, não permitem a queda.

Outras dicas

Simplesmente testar a igualdade de referência ao deixar cair. Algo parecido com isto:

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

Eu não poderia encontrar uma boa resposta para isso, embora parece que ele deve ser um problema comumente encontrado. Então eu usei a resposta do gbianchi da seguinte maneira:

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

Agora, eu realmente fiz isso especificamente para evitar "errante" clicar duas vezes em que o mouse se move um pouco entre um clique duplo. Isso evita que cliques duplos registrando quanto arrastar cai bem como responder a pergunta PO.

Mind você, ele não aparece para trabalhar 100% do tempo. Aparentemente, alguns eventos são "perdidos" em como a 1 fora de 20 casos. Eu não identificaram exatamente o que varia naquelas situações onde se regista uma queda sobre si mesmo. No caso de prevenir cliques duplos registrar como gotas de arrasto, 95% é bom o suficiente, porque ele estava sendo posto em prática para evitar a irritação. Se você precisa de algo que é 100% eficaz, você pode ter que tentar outra coisa ou descobrir por que ele não funciona nesses poucos casos.

É uma maneira de armazenar uma string descrevendo o que você está arrastando na DataObject quando você começar a arrastar, isto é:

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

Em seguida, no check DragEnter para ver se a bandeira está lá:

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

Como definir a flag como false no evento MouseLeave não funcionam corretamente para mim. MouseLeave manteve a ser chamado assim que eu chamei DoDragDrop.

Eu finalmente tenho que trabalhar direito o seguinte:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top