Como posso evitar que o 'eu' arrastar e soltar em um datagridview?
-
03-07-2019 - |
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
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