2011-09-10 11 views

Respuesta

18

simplemente no lo utiliza GetDataPresent(), que es repetitivo, pero usted es libre de hacerlo a su manera. En realidad recuperar el objeto y comprobar si está contento con su 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; 
     } 
    } 

donde la base es el nombre de la clase base. Si bien el uso de GetFormats() parece extraño, se garantiza que este enfoque funciona porque arrastrar un objeto .NET solo produce un formato, el nombre para mostrar del tipo del objeto. Este es también el motivo por el que GetDataPresent no puede funcionar para objetos derivados.

+1

genial, gracias .. –

+0

Gracias! La pregunta cubre mi problema exacto, ¡y la respuesta es una resolución perfecta! :) – mbmcavoy

6

he respondido a una pregunta similar con anterioridad: C# Drag and Drop - e.Data.GetData using a base class

Lo que puede hacer es crear una clase de recipiente que contiene los datos que se está arrastrando. Y luego, en GetDataPresent, comprueba el tipo de clase de contenedor y, si está presente, puede leer el miembro de contenido que contiene la instancia real de sus datos.

Aquí hay un ejemplo rápido, si su tipo base es DragDropBaseData, puede crear la siguiente clase DragDropInfo.

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

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

Y entonces la caída de arrastre se puede iniciar con la siguiente, donde DrafDropDerivedData es una clase derivada de DragDropBaseData.

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

Y se puede acceder a los datos en los eventos de arrastre utilizando la siguiente

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

Gracias Chris, buena respuesta, pero mira la de Hans por favor. –

+0

@French Boy, Hans ha dado una buena respuesta. Requiere más de la infraestructura de reflexión que simplemente saber que todos los tipos derivados están envueltos en un tipo conocido llamado DragDropInfo como en mi ejemplo, pero dudo mucho que la reflexión sea un problema, por lo que es una respuesta clara. –

Cuestiones relacionadas