2010-06-30 50 views
8

我已經在我的應用程序中實現了拖放功能,但在確定被拖動的對象的類型時遇到了一些困難。我有一個基類Indicator和從它派生的幾個類。拖動的對象可以是這些類型中的任何一種。下面的代碼片段看起來不夠優雅,容易出現維護問題。每次我們添加一個新的派生類時,我們都必須記住觸摸這個代碼。似乎我們應該能夠以某種方式在這裏使用繼承。如何從DragEventArgs中確定數據類型

protected override void OnDragOver(DragEventArgs e) 
    { 
    base.OnDragOver(e); 

    e.Effect = DragDropEffects.None; 

    // If the drag data is an "Indicator" type 
    if (e.Data.GetDataPresent(typeof(Indicator)) || 
     e.Data.GetDataPresent(typeof(IndicatorA)) || 
     e.Data.GetDataPresent(typeof(IndicatorB)) || 
     e.Data.GetDataPresent(typeof(IndicatorC)) || 
     e.Data.GetDataPresent(typeof(IndicatorD))) 
    { 
     e.Effect = DragDropEffects.Move; 
    } 
    } 

同樣,我們使用的GetData問題真正得到拖動的對象:

protected override void OnDragDrop(DragEventArgs e) 
{ 
    base.OnDragDrop(e); 

    // Get the dragged indicator from the DragEvent 
    Indicator indicator = (Indicator)e.Data.GetData(typeof(Indicator)) ?? 
          (Indicator)e.Data.GetData(typeof(IndicatorA)) ?? 
          (Indicator)e.Data.GetData(typeof(IndicatorB)) ?? 
          (Indicator)e.Data.GetData(typeof(IndicatorC)) ?? 
          (Indicator)e.Data.GetData(typeof(IndicatorD)); 
} 

感謝。

回答

8

商店通過明確指定類型的數據,即

dataObject.SetData(typeof(Indicator), yourIndicator); 

這將允許你剛纔基礎上,Indicator類型進行檢索,而不是子類型。

+0

這就像一個冠軍! 要完成您的解決方案: 在OnMouseDown裏面,我曾經有: DoDragDrop(indicator,DragDropEffects.Move); 現在,它看起來像這樣: DataObject d = new DataObject(); d。設置數據(typeof(Indicator),indicator); 012DDDDDrop(d,DragDropEffects.Move); – NascarEd 2010-06-30 14:48:43

2

還有的IDataObject.GetFormats方法:

返回的存儲在該實例中的數據與相關聯的或可以轉化爲所有格式的列表。

它的String數組:

String[] allFormats = myDataObject.GetFormats(); 

然後,您可以檢查清單你的類型,其中之一應該是Indicator我還以爲。