如何防止数据网格中的“自我”拖放?

时间:2009-03-05 11:29:39

标签: vb.net datagridview drag-and-drop

我正在两个datagridviews之间实现拖放功能。这可以按预期工作,但有一个例外:可以在同一个datagridview中拖放。这会导致重复的行。我想限制功能,以便我只能从一个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

5 个答案:

答案 0 :(得分:1)

只是一个简单的想法。如果在开始拖动时保留原始网格的名称,该怎么办?当您执行drop时检查名称,如果它们是同一个对象,则不允许删除。

答案 1 :(得分:0)

在删除时只需测试引用相等性。像这样:

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

答案 2 :(得分: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个案例中被“丢失”了。我没有确切地知道在它注册掉落的情况下有什么不同。在防止双击注册为拖拽下降的情况下,95%是足够好的,因为它只是为了避免烦恼而被放置到位。如果你需要100%有效的东西,你可能需要尝试别的东西或弄清楚为什么它在这几种情况下不起作用。

答案 3 :(得分: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

答案 4 :(得分:0)

MouseLeave事件中将标记设置为false对我来说无效。我打电话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;

Carlos A Merighe