3

2つのデータグリッドビュー間にドラッグアンドドロップ機能を実装しています。これは、1つの例外を除いて意図したとおりに機能します。同じデータグリッドビュー内でドラッグアンドドロップすることが可能です。これにより、行が重複します。あるデータグリッドビューから別のデータグリッドビューにしかドラッグできないように、機能を制限したいと思います。誰かがこれをどのように達成できるか知っていますか?なんらかのヒットテストが必要だと思いますが、どうやって実装したらいいのかわかりません...

私が使用しているコードは次のとおりです。

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
4

5 に答える 5

1

簡単なアイデア。ドラッグを開始するときに、原点グリッドの名前を保持している場合はどうなりますか。ドロップを行うときは、名前を確認してください。それらが同じオブジェクトである場合は、ドロップを許可しないでください。

于 2009-03-05T11:38:32.407 に答える
0

イベントでフラグを false に設定しても、MouseLeave正しく機能しませんでした。 MouseLeave私が電話するとすぐに呼ばれ続けましDoDragDropた。

私は最終的に次のように正しく動作するようになりました:

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;

カルロス・メリゲ

于 2015-09-09T15:31:13.887 に答える
0

ドロップ時に参照が等しいかどうかをテストするだけです。このようなもの:

If Object.ReferenceEquals(droppedThing, thingWhereItWasDropped)
    ' Don't drop it
Else
    ' Drop it
End If
于 2009-03-05T11:42:28.857 に答える
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% 効果的なものが必要な場合は、別の方法を試すか、これらのいくつかのケースで機能しない理由を突き止める必要があるかもしれません.

于 2011-07-12T19:19:09.270 に答える
0

1 つの方法は、ドラッグを開始するときに、ドラッグしているものの文字列の説明を 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
于 2012-08-01T07:20:35.537 に答える