我正在两个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
答案 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