2011-09-10 6 views

risposta

18

Proprio non usano GetDataPresent(), è boilerplate, ma sei libero di fare a modo tuo. In realtà recuperare l'oggetto e verificare se sei felice con il suo tipo:

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

Dove Base è il nome della classe di base. Sebbene l'uso di GetFormats() sia strano, questo approccio è garantito perché il trascinamento di un oggetto .NET produce sempre solo il formato , il nome visualizzato del tipo di oggetto. Quale è anche la ragione per cui GetDataPresent non può funzionare per oggetti derivati.

+1

Grande, grazie .. –

+0

Grazie! La domanda copre il mio problema esatto e la risposta è una risoluzione perfetta! :) – mbmcavoy

6

ho risposto a una domanda simile in precedenza: C# Drag and Drop - e.Data.GetData using a base class

Che cosa si può fare è creare una classe contenitore che contiene i dati che si sta trascinando. Quindi, nel GetDataPresent, si controlla il tipo di classe del contenitore e, se è presente, è possibile leggere il membro del contenuto che contiene l'istanza effettiva dei dati.

Ecco un breve esempio, se il tipo di base è DragDropBaseData, è possibile creare la seguente classe DragDropInfo.

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

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

E poi la caduta di trascinamento può essere avviata con il seguente, dove DrafDropDerivedData è una classe derivata da DragDropBaseData.

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

E si può accedere ai dati negli eventi di trascinamento con la seguente

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

Grazie Chris, bella risposta, ma guarda quella di Hans per favore. –

+0

@French Boy, Hans ha dato una bella risposta. Richiede di più dall'infrastruttura di riflessione, piuttosto che sapere che tutti i tipi derivati ​​sono racchiusi in un tipo noto chiamato DragDropInfo come nel mio esempio, ma dubito seriamente che il riflesso sia un problema, quindi è una risposta chiara. –

Problemi correlati