2010-06-30 8 views
8

Ich habe Drag & Drop in meiner Anwendung implementiert, habe aber Schwierigkeiten, den Typ des Objekts zu bestimmen, das gezogen wird. Ich habe eine Basisklasse Indicator und mehrere davon abgeleitete Klassen. Ein gezogenes Objekt könnte von einem dieser Typen sein. Das folgende Code-Snippet scheint unelegant zu sein und ist anfällig für Wartungsprobleme. Jedes Mal, wenn wir eine neue abgeleitete Klasse hinzufügen, müssen wir daran denken, diesen Code zu berühren. Es scheint, als ob wir in der Lage sein könnten, die Vererbung hier irgendwie zu verwenden.So bestimmen Sie den Datentyp von 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; 
    } 
    } 

Ebenso haben wir Probleme GetData verwenden, um tatsächlich das gezogene Objekt zu erhalten:

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)); 
} 

Dank.

Antwort

8

Speichern Sie Ihre Daten, die durch den Typ explizit spezifiziert, das heißt

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

Dies ermöglicht es Ihnen, es abzurufen nur auf der Grundlage des Indicator Typ, anstatt das Kind Typ.

+0

Das funktioniert wie ein Champion! Um Ihre Lösung abzuschließen: Innerhalb von OnMouseDown, ich hatte: DoDragDrop (Indikator, DragDropEffects.Move); Jetzt sieht es so aus: DataObject d = new DataObject(); d.SetData (typeof (Indikator), Indikator); DoDragDrop (d, DragDropEffects.Move); – NascarEd

2

Es gibt die IDataObject.GetFormats Methode:

Gibt eine Liste aller Formate, die in diesem Fall gespeicherten Daten zugeordnet sind oder können umgewandelt werden.

Es ist eine Reihe von String:

String[] allFormats = myDataObject.GetFormats(); 

Sie könnten dann überprüfen Sie die Liste für Ihre Art, von denen Indicator sein sollte ich gedacht hätte.

Verwandte Themen