2010-04-28 16 views
7

Sto usando C# e WinForms 3.5C# Drag and Drop - e.Data.GetData utilizzando una classe base

Ho un elenco di utente controlla tutte derivate da una classe di base. Questi controlli possono essere aggiunti a vari pannelli e sto cercando di implementare la funzionalità di trascinamento, il problema che sto eseguendo è sull'evento DragDrop.

Per DragEventArgs e.Data.GetData(typeof(baseClass)) non funziona. Vuole:

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

C'è un modo per aggirare questo, o un modo migliore per architettarlo?

+0

Avrebbe un'interfaccia reciproca da trasmettere per aiutare? – used2could

+0

No, un'interfaccia non cambia nulla. –

risposta

17

È possibile disporre i dati in una classe comune. Per esempio, assumendo classe di vostra base si chiama DragDropBaseControl

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

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

E poi la caduta di trascinamento può essere avviata con il seguente nella classe base

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

E si può accedere ai dati negli eventi di trascinamento utilizzando il seguente

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

Ho compreso correttamente la richiesta?

+0

Ci proverò e tornerò, ma sembra promettente. –

0

Per ottenere l'oggetto trascinato dinamicamente, senza nemmeno conoscere il tipo o il relativo tipo di base, uso questo codice all'interno dell'evento DragDrop:

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

come e.Data.GetFormats()[0] avrà sempre la rappresentazione di stringa del tipo di trascinata oggetto.

Nota che presumo che sia stato trascinato un oggetto ma l'idea è la stessa per più oggetti trascinati.