2011-09-10 33 views

回答

18

只要不使用GetDataPresent()訪問拖動事件中的數據,這是樣板,但你可以自由地做你的方式。其實檢索對象和檢查,如果你很高興與它的類型:

protected override void OnDragEnter(DragEventArgs drgevent) { 
     var obj = drgevent.Data.GetData(drgevent.Data.GetFormats()[0]); 
     if (typeof(Base).IsAssignableFrom(obj.GetType())) { 
      drgevent.Effect = DragDropEffects.Copy; 
     } 
    } 

其中base是基類的名稱。雖然GetFormats()的使用看起來很奇怪,但這種方法可以保證工作,因爲拖動一個.NET對象只產生一個格式,即對象類型的顯示名稱。這也是GetDataPresent不能用於派生對象的原因。

+1

太好了,謝謝.. –

+0

謝謝!這個問題涵蓋了我確切的問題,答案是一個完美的解決方案! :) – mbmcavoy

6

我已經回答過類似的問題之前:C# Drag and Drop - e.Data.GetData using a base class

你可以做的是創建其中認爲您拖動數據的容器類。然後在GetDataPresent中檢查容器類的類型,如果它存在,則可以讀取包含數據實際實例的內容成員。

這裏是一個簡單的例子,如果你的基類型是DragDropBaseData,你可以創建下面的DragDropInfo類。

public class DragDropInfo 
{ 
    public DragDropBaseData Value { get; private set; } 

    public DragDropInfo(DragDropBaseData value) 
    { 
    this.Value= value; 
    } 
} 

然後是拖放可與以下,其中DrafDropDerivedData是DragDropBaseData派生的類來啓動。

DoDragDrop(new DragDropInfo(new DragDropDerivedData()), DragDropEffects.All); 

而且你可以用下面的

e.Data.GetData(typeof(DragDropInfo)); 
+0

謝謝克里斯,很好的答案,但看看漢斯的一個請。 –

+0

@法國男孩漢斯給出了一個很好的答案。它需要更多來自反射基礎設施,而不僅僅是知道所有的派生類型都被封裝在一個名爲DragDropInfo的已知類型中(如我的示例中那樣),但我嚴重懷疑反射會成爲一個問題,因此它是簡潔的答案。 –

相關問題