2010-04-28 11 views
7

Używam C# i WinForm 3,5C# Drag and Drop - e.Data.GetData użyciu klasy bazowej

Mam listę użytkownik kontroluje wszystkie pochodzą od jednej klasy bazowej. Te elementy sterujące można dodawać do różnych paneli i próbuję zaimplementować funkcję przeciągania i upuszczania, a problem, na który wpadam, dotyczy zdarzenia DragDrop.

Dla DragEventArgs e.Data.GetData(typeof(baseClass)) nie działa. Chce:

e.Data.GetData(typeof(derivedClass1)) 
e.Data.GetData(typeof(derivedClass2)) 
etc... 

Czy istnieje sposób, w jaki można obejść ten problem, lub lepszy sposób na jego zaprojektowanie?

+0

Czy posiadanie wspólnego interfejsu do rzutowania może pomóc? – used2could

+0

Nie, interfejs niczego nie zmienia. –

Odpowiedz

17

Możesz zawinąć dane we wspólnej klasie. Na przykład, zakładając, że klasa bazowa jest nazywana DragDropBaseControl

public class DragDropInfo 
{ 
    public DragDropBaseControl Control { get; private set; } 

    public DragDropInfo(DragDropBaseControl control) 
    { 
    this.Control = control; 
    } 
} 

A potem spadek drag może być zainicjowane z następujących czynności w klasie bazowej

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

I można uzyskać dostęp do danych w wydarzeniach drag korzystania Poniższe

Czy dobrze zrozumiałem twoje wymagania?

+0

Spróbuję i wrócę, ale wygląda obiecująco. –

0

Aby uzyskać przeciągany obiekt dynamicznie, nawet nie znając jego typ lub jego typ bazowy, używam tego kodu wewnątrz przypadku DragDrop:

baseClass myObject = (baseClass)e.Data.GetData(e.Data.GetFormats()[0]); 

jak e.Data.GetFormats()[0] zawsze będzie posiadał znaków reprezentujący typ przeciągnięty obiekt.

Należy zauważyć, że założyłem, że przeciągnięto jeden obiekt, ale pomysł jest taki sam dla wielu przeciągniętych obiektów.

Powiązane problemy