2010-04-28 16 views
7

estoy usando C# y Windows Forms 3.5C# arrastrar y soltar - e.Data.GetData usando una clase base

tengo una lista de usuario controla todas derivadas de una clase base. Estos controles se pueden agregar a varios paneles y estoy tratando de implementar la funcionalidad de arrastrar y soltar, el problema al que me estoy ejecutando es en el evento DragDrop.

Para DragEventArgs e.Data.GetData(typeof(baseClass)) no funciona. Quiere:

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

¿Hay alguna manera de evitar esto o una mejor manera de diseñarlo?

+0

¿Tendría una interfaz común para ayudar? – used2could

+0

No, una interfaz no cambia nada. –

Respuesta

17

Puede envolver los datos en una clase común. Por ejemplo, suponiendo que la clase de su base se denomina DragDropBaseControl

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

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

Y entonces la caída de arrastre se puede iniciar con la siguiente en la clase base

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

Y se puede acceder a los datos en los eventos de arrastre usando el siguiente

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

¿He entendido bien su requisito?

+0

Lo intentaré y volveré, pero parece prometedor. –

0

Para obtener el objeto arrastrado de forma dinámica, sin siquiera saber su tipo o su tipo base, utilizo este código dentro del evento DragDrop:

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

como e.Data.GetFormats()[0] siempre tendrá representación de cadena del tipo de la arrastrado objeto.

Tenga en cuenta que asumí que se arrastró un objeto, pero la idea es la misma para múltiples objetos arrastrados.