2009-03-05 28 views
1

私は2つのデータグリッドビューの間でドラッグアンドドロップ機能を実装しています。 1つの例外を除いて、これは意図したとおりに動作します。同じデータグリッドビュー内でドラッグアンドドロップすることは可能です。これにより、行が重複します。あるデータグリッドビューから別のデータグリッドビューにドラッグすることができるように機能を制限したい。誰でもこれがどのように達成できるか知っていますか?DataGridviewで「自己」ドラッグアンドドロップを防止するにはどうすればよいですか?

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 

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 
を:私は次のように私が使用していたコードがある

...ヒットテストのいくつかの種類が必要ですが、私はこれを実装するかどうかはわかりません推測しています

答えて

1

ちょっとしたアイデア。ドラッグを開始したときに、元のグリッドの名前を保持するとどうなりますか?ドロップを行うときに名前を確認し、同じオブジェクトである場合はドロップを許可しないでください。

0

落書き時に参照平等をテストするだけです。このようなもの:

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

私が落下していますものがどこから来るかどのように私は知っていますか? – Simon

+0

@R。 Martinho Fernandes、私も不思議です。どのように両方の値を取得できますか? – LuckyLuke82

0

これはよく遭遇する問題であるように思えますが、私はこれに対して良い答えを見つけることができませんでした。だから私は、次のようにgbianchiの回答を使用:今すぐ

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

、私は実際にこれは、特にマウスがダブルクリックの間でビットを移動、ダブルクリックを「放浪」を防止するためでした。これにより、ドラッグのドロップやOPの質問に対する二重クリックの登録が防止されます。

あなたは100%時間がかかることはありません。どうやら、20件中1件が「失われている」ようなイベントもあります。私はそれが自分自身に落とし穴を登録するそれらの状況で何が変わるかを正確に特定していない。ドラッグドロップとして登録されるダブルクリックを防止する場合、95%は煩わしさを避けるために置かれているだけで十分です。 100%有効なものが必要な場合は、何か別のものを試してみるか、そのような場合には効果がない理由を理解する必要があります。

+0

これは、マウスの葉が再度入力された場合は機能しません。 – CrazyTim

0

一つの方法は、あなたがドラッグを開始するときに、すなわち、DataObjectの中にドラッグされているものの説明文字列を格納することです:

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

その後のDragEnterにフラグがあるかどうかを確認します。

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

MouseLeaveイベントでフラグをfalseに設定すると、正しく動作しませんでした。私がDoDragDropと呼ぶとすぐにMouseLeaveが呼び出されていました。

次のように私は最終的にそれが正しい動作するようになった:

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; 

カルロスA Merighe

関連する問題