2009-03-05 60 views
1

我正在實現兩個datagridviews之間的拖放功能。這可以按預期工作,但有一個例外:可以在同一個datagridview中拖放。這導致重複的行。我想限制功能,以便我只能從一個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 

回答

1

只是一個快速的想法。如果當你開始拖動你持有原始網格的名稱。當你做下降檢查名稱,如果他們是同一個對象,然後不允許下降。

0

簡單地測試下降時的參考相等性。類似這樣的:

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

我怎麼知道,我丟棄的東西從何而來? – Simon 2009-03-05 12:23:27

+0

@R。馬丁尼費爾南德斯,我也很好奇。你如何獲得這兩個值? – LuckyLuke82 2016-12-20 20:58:49

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%的工作時間。顯然,有些事件在1個20個案例中「丟失」。我沒有確切地說明在註冊掉本身的情況下會發生什麼變化。在防止雙擊註冊爲拖放的情況下,95%已經足夠好了,因爲它只是爲了避免煩惱而設置。如果你需要100%有效的東西,你可能需要嘗試其他的東西,或者找出爲什麼它在這種情況下不起作用。

0

的一種方法是存儲你所拖動的數據對象,當你開始拖動,即一串描述:

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對我而言無法正常工作。 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; 

卡洛斯一Merighe