2009-03-05 5 views
1

Je suis en train de mettre en œuvre la fonctionnalité glisser-déposer entre deux datagridviews. Cela fonctionne comme prévu avec une exception: il est possible de faire glisser et déposer dans la même vue de données. Cela entraîne des lignes dupliquées. Je veux limiter la fonctionnalité de sorte que je puisse seulement faire glisser d'une vue de données à une autre. Est-ce que quelqu'un sait comment cela peut être réalisé? Je devine une sorte de test de recherche est nécessaire, mais je ne suis pas sûr de savoir comment mettre en œuvre cette ...Comment empêcher le 'self' de glisser-déposer dans un datagridview?

Le code que je utilise est la suivante:

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 

et

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 

Répondre

1

Juste une petite idée. Que faire si vous commencez à faire glisser le nom de la grille d'origine. Lorsque vous faites la chute, vérifiez le nom, s'il s'agit du même objet, n'autorisez pas la suppression.

0

Il suffit de tester l'égalité de référence lors de la suppression. Quelque chose comme ceci:

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

Comment puis-je savoir où la chose que je tombais vient? – Simon

+0

@R. Martinho Fernandes, je suis curieux aussi. Comment pouvez-vous obtenir les deux valeurs ?? – LuckyLuke82

0

je ne pouvais pas trouver une bonne réponse pour cela, bien qu'il semble que ce doit être un problème fréquemment rencontré. Alors je la réponse de gbianchi de la manière suivante:

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

Maintenant, en fait je l'ai fait spécifiquement pour empêcher « errance » doubles clics où la souris se déplace un peu entre un double clic. Cela empêche les doubles clics d'être enregistrés comme des gouttes de drag et de répondre à la question OPs.

Rappelez-vous, cela ne semble pas fonctionner à 100% du temps. Apparemment, certains événements sont "perdus" dans 1 cas sur 20. Je n'ai pas identifié exactement ce qui varie dans les situations où il enregistre une goutte sur lui-même. Dans le cas d'empêcher les doubles-clics de s'inscrire comme des gouttes de drag, 95% est assez bon parce qu'il était juste mis en place pour éviter l'ennui. Si vous avez besoin de quelque chose qui est efficace à 100%, vous devrez peut-être essayer autre chose ou comprendre pourquoi cela ne fonctionne pas dans ces quelques cas.

+0

Cela ne fonctionnera pas si la souris quitte puis entre à nouveau. – CrazyTim

0

Une façon est de stocker une description de chaîne de ce que vous faites glisser dans le DataObject lorsque vous commencez à glisser, à savoir:

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

Ensuite, lors de l'enregistrement DragEnter pour voir si le drapeau 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 
0

La définition de l'indicateur sur false dans l'événement MouseLeave ne fonctionnait pas correctement pour moi. MouseLeave a continué à être appelé dès que j'ai appelé DoDragDrop.

j'ai finalement eu à travailler à droite comme suit:

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

Questions connexes