2010-09-02 24 views
1

我必須錯過簡單的東西,但我的大腦即將流血。VB.NET拖放如果對象實現接口

我有一個接口,爲了名爲MyInterface的參數。

我有一個控件類,讓它命名爲實現MyInterface的「Parent」。

我還有一個控制類,它繼承父,叫「孩子」

我有一個最終控制類可稱之爲「容器」,即接受拖動父到它。

爲的dragover在容器中的代碼很簡單,就像這樣:

Protected Overrides Sub OnDragOver(ByVal e As System.Windows.Forms.DragEventArgs) 
     If e.Data.GetDataPresent(GetType(Parent)) Then 
      e.Effect = DragDropEffects.Move 
     End If 
     MyBase.OnDragOver(e) 
     Refresh() 
    End Sub 

我要修改此並不是只接受家長,但接受任何實現MyInterface的。我無法弄清楚它是如何得到它的工作。

更令人困惑的是,如果我將上述代碼拖到Container上,並且代碼如上所示(檢查Parent是否被刪除),GetDataPresent總是返回false。我認爲它會起作用,因爲Child繼承了父項。

理想情況下,我想有這樣的事情:

Protected Overrides Sub OnDragOver(ByVal e As System.Windows.Forms.DragEventArgs) 
     If e.Data.GetDataPresent(GetType(MyInterface)) Then 
      e.Effect = DragDropEffects.Move 
     End If 
     MyBase.OnDragOver(e) 
     Refresh() 
    End Sub 

但它的炸彈和GetDataPresent返回false我是否拖了家長或孩子。我在某個地方是個白癡......但我知道在哪裏。幫幫我?

回答

1

Data對象使用該類型作爲集合中的鍵。所以它尋找完全匹配。

我相信你需要檢查Data是否有Object(即絕對的任何對象),如果有,請檢索它並檢查它是否支持與TypeOf的接口。

+0

啊,我不知道它是這樣工作的。我一直認爲它在內部做了一些類似TryCast的檢查,反對查找。很高興知道。是的,檢查對象是很容易的,但我會去得到簡單的對象嗎? GetData()需要一個類型,並將MyInterface或者System.Object傳遞給它,它不會返回任何內容。我試過它:e.Data.GetData(GetType(MyInterface)) – instantmusic 2010-09-02 20:31:59

+0

@instantmusic爲了得到一個普通的對象,你需要在第一個地方放置一個普通的對象:)'DataObject.SetData(GetType(Object),your_object) ' – GSerg 2010-09-02 20:55:32

+0

關閉,但沒有雪茄(除非我不明白)。 SetData只是改變了e.Data中的數據,但我已經在其他地方從DoDragDrop獲得了信息。 GetData雖然總是不會返回任何東西,除非我告訴它確切的類型來接收,我自然不想做,因爲我正在檢查MyInterface而不是類型。 果然,拖放信息正在進入子。 – instantmusic 2010-09-02 21:17:10